Код:Несколько асинхронных операций с Делегаты
private delegate void NotificationDelegate(sis_company company, int days, string type, string param);
private NotificationDelegate _notDel;
private void Notifications(sys_company company, int days, string type, string param)
{
if (*something*)
{
_notDel = SendEmails;
_notDel.BeginInvoke(company, days, type, param, CallBackNotification, null);
}
}
private void SendEmails(sys_company company, int days, string type, string param)
{
//Here I'll send all e-mails.
}
private void CallBackNotification(IAsyncResult r)
{
if (this.IsDisposed) return;
try
{
_notDel.EndInvoke(r);
}
catch (Exception ex)
{
LogWriter.Log(ex, "EndInvoke Error");
}
}
Ожидаемое поведение:
Метод Notifications
вызывается всякий раз, когда компания соответствует сроку. Во время инициализации метод петли для каждой компании и вызывает в этом цикле Notifications
.
Проблема:
Как вы можете видеть, _notDel
является глобальной переменной, используется в дальнейшем для EndInvoke
delegate
. Проблема заключается в том, что после второго Notifications
вызова, объект не то же самое больше, что дает мне ошибку, которая говорит:
«объект IAsyncResult не совпадает этот делегат.»
Почему '_notDel' глобальный? Можете ли вы сделать это на один экземпляр? Вы должны инкапсулировать каждый экземпляр делегата, чтобы это работало. –
Вам просто нужен переходный объект, который содержит делегат в качестве поля, которое передается как параметр состояния для последующего использования. –
@YuvalItzchakov Как я могу «EndInvoke» внутри 'CallBackNotification'? –