2016-01-25 3 views
0

Я хотел реализовать метод, который отвечает за подписку на мой Webclient для обработчиков, и когда я хочу отказаться от подписки, кажется, что это сделано неправильно. У меня есть пример:Отказаться от обработчика события Webclient на C#?

моя функция используется для подписки

private void SendRequest(Action<object, UploadStringCompletedEventArgs> callback, string url) 
{ 
    if (!wClient.IsBusy) 
    { 
     wClient.UploadStringCompleted += new UploadStringCompletedEventHandler(callback); 
     wClient.UploadStringAsync(new Uri(url), "POST");   
     [...] 
    } 
} 

моих обработчиков

private void wClient_request1Completed(object sender, UploadStringCompletedEventArgs e) 
{ 
    wClient.UploadStringCompleted -= wClient_request1Completed; 
    [...] 
} 

private void wClient_request2Completed(object sender, UploadStringCompletedEventArgs e) 
{ 
    wClient.UploadStringCompleted -= wClient_request2Completed; 
    [...] 
} 

и я использую эти методы, как этот

private WebClient wClient = new WebClient(); 

SendRequest(wClient_request1Completed, myUrl1); 
// wClient_request1Completed(..) is run successfully 

[... Request 1 is already completed ...] 

SendRequest(wClient_request2Completed, myUrl2); 
// wClient_request1Completed(..) and wClient_request2Completed(..) are run 

У Вас есть идея о моей проблеме? Большое вам спасибо!

ответ

0

Это потому, что вы неявно создаете новый делегат в качестве параметра вашего метода SendRequest. В принципе, ваш текущий код может быть переписан:

// Done implicitly by the compiler 
var handler = new Action<object, UploadStringCompletedEventArgs>(wClient_request1Completed); 

wClient.UploadStringCompleted += handler; 

// ... 

wClient.UploadStringCompleted -= wClient_request1Completed // (instead of handler) 

Один из способов исправить это может быть использовать параметр полезной нагрузки методы UploadStringAsync сохранить ссылку на обработчик:

var handler = new UploadStringCompletedEventHandler(callback); 
wClient.UploadStringCompleted += handler; 
wClient.UploadStringAsync(new Uri(url), "POST", null, handler);   

Тогда, в UploadStringCompleted мероприятия:

private void wClient_request1Completed(object sender, UploadStringCompletedEventArgs e) 
{ 
    var handler = (UploadStringCompletedEventHandler)e.UserState; 

    wClient.UploadStringCompleted -= handler ; 
    [...] 
} 

Тем не менее, вы должны рассмотреть вопрос о переходе на HttpClient и асинхронном/ОЖИДАНИЕ модели программирования, как это сделал бы ваш гр Оде легче понять.

+0

Большое вам спасибо, это отлично решает мою проблему! – Xavier

Смежные вопросы