2011-03-26 156 views
0

我有這樣的代碼:是否可以「加入」DownloadStringAsync操作?

public static String Download(string address) { 
    WebClient client = new WebClient(); 
    Uri uri = new Uri(address); 

    // Specify a progress notification handler. 
    client.DownloadProgressChanged += (_sender, _e) => { 
     // 
    }; 

    // ToDo: DownloadStringCompleted event 

    client.DownloadStringAsync(uri); 
} 

而不必我的代碼的其餘部分的執行在DownloadStringCompleted事件處理程序的下載完成後,我可以採用某種Join這個異步請求?它將被安置在另一個線程中(這樣做,以便我可以訪問下載進度)。我知道DownloadStringAsync可以採取第二個參數;手冊中稱爲userToken的對象。這可以用嗎?謝謝,

回答

2

你可以使用一個manual reset event

class Program 
{ 
    static ManualResetEvent _manualReset = new ManualResetEvent(false); 

    static void Main() 
    { 
     WebClient client = new WebClient(); 
     Uri uri = new Uri("http://www.google.com"); 

     client.DownloadProgressChanged += (_sender, _e) => 
     { 
      // 
     }; 

     client.DownloadStringCompleted += (_sender, _e) => 
     { 
      if (_e.Error == null) 
      { 
       // do something with the results 
       Console.WriteLine(_e.Result); 
      } 
      // signal the event 
      _manualReset.Set(); 
     }; 

     // start the asynchronous operation 
     client.DownloadStringAsync(uri); 

     // block the main thread until the event is signaled 
     // or until 30 seconds have passed and then unblock 
     if (!_manualReset.WaitOne(TimeSpan.FromSeconds(30))) 
     { 
      // timed out ... 
     } 
    } 
} 
+0

完美,謝謝! – 2011-03-26 17:21:45

+0

您的修改更加完美,因爲我希望在一段時間後請求超時。再次感謝!! – 2011-03-26 17:27:31

1

我的第一個想法是使用DownloadString,同步版本DownloadStringAsync。但是,您似乎必須使用異步方法來獲取進度通知。好的,這沒什麼大不了的。只需訂閱DownloadStringCompleted並使用一個簡單的等待句柄(如ManualResetEventSlim)阻止,直到它完成。

有一點需要注意的是,我不確定是否對DownloadStringAsync甚至提出了進度通知。根據MSDN,DownloadProgressChanged與一些異步方法相關聯,但不是DownloadStringAsync

+0

「......做這種方式讓我有機會獲得下載進度......」 – 2011-03-26 17:15:45

+0

@SimpleCoder:是啊,我意識到自己的天真的答案是錯後我發佈了......現在修好了,我希望! – bobbymcr 2011-03-26 17:19:46

+0

沒問題,謝謝你的答案!我剛剛嘗試了達林季米特洛夫的代碼,事件確實引發了。 – 2011-03-26 17:22:28

相關問題