2015-02-02 3 views
0

Код:Несколько асинхронных операций с Делегаты

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 является глобальной переменной, используется в дальнейшем для EndInvokedelegate. Проблема заключается в том, что после второго Notifications вызова, объект не то же самое больше, что дает мне ошибку, которая говорит:

«объект IAsyncResult не совпадает этот делегат

+0

Почему '_notDel' глобальный? Можете ли вы сделать это на один экземпляр? Вы должны инкапсулировать каждый экземпляр делегата, чтобы это работало. –

+1

Вам просто нужен переходный объект, который содержит делегат в качестве поля, которое передается как параметр состояния для последующего использования. –

+0

@YuvalItzchakov Как я могу «EndInvoke» внутри 'CallBackNotification'? –

ответ

1

Просто передайте свой notDel в качестве последнего параметра для BeginInvoke и используйте r.AsyncState, чтобы получить делегат источника.

//Call like this: 

NotificationDelegate notDel = Notifications; 
notDel.BeginInvoke(company, days, type, param, CallBackNotification, notDel); 

//And inside the CallBack: 

var del = r.AsyncState as NotificationDelegate; 

if (del != null) 
    del.EndInvoke(r); 
Смежные вопросы