2010-07-25 2 views
2

Код:Темы - ResetEvent и WebClient

public string GetTextWebRequest(string url) 
    { 
     WebClient cl = new WebClient(); 
     cl.DownloadStringCompleted += new DownloadStringCompletedEventHandler(cl_DownloadStringCompleted); 
     cl.DownloadStringAsync(new Uri(url)); 
     are.WaitOne(); 
     return _textdata; 
    } 

    void cl_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     _textdata = e.Result; 
     are.Set(); 
    } 

Почему я не использую метод 'DownloadString'? Потому что я использую компактную структуру, и async - единственный вариант, который у меня есть.

Во всяком случае, моя проблема - «DownloadStringCompleted» не вызывается, если основной (вызывающий) поток заблокирован. И таким образом никогда не разблокируется.

Мои единственные мысли в том, что WebClient вызывает «DownloadStringCompleted» в вызывающем потоке, что не имеет смысла?

Я немного потерян.

ответ

1

Мои только мысли, что WebClient является призвание «DownloadStringCompleted» на вызывающий поток, который не делает смысл?

Но это именно то, что происходит. Он плохо документирован, но этот метод + событие следует за моделью backgroundworker. Вы можете видеть отношения в элементах DownloadStringCompletedEventArgs.

Шаблон Bgw используется в разных местах библиотеки WinForms (связанных). См. Например, элемент управления PictureBox.

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

+0

ahhh, я так и думал. Хорошо спасибо за подтверждение. – Peanut