2011-06-16 78 views
4

我需要從Https源文件下載文件。 我會做這個asynchron這樣的(作品至今):完成後等待類方法完成C#

void doChecksbeforDownload(){ 
//Do some Checks 
    DownloadFileAsync(); 

} 

void DownloadFileAsync(){ 
    ... 
    ... 
    this.client.UploadStringCompleted += new UploadStringCompletedEventHandler(client_UploadStringCompleted); 
    this.client.Headers["Content-Type"] = "application/x-www-form-urlencoded"; 
    this.client.UploadStringAsync(new Uri(url), "POST", PostParameter); 
    ... 
    ... 
} 

,並調用client_UploadStringCompleted()方法:

void client_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e) 
    { 
     //Do Check here 
    } 

到目前爲止好。現在我把所有這一切在一類「功能」並調用該方法是這樣的:

Functions f = new Functions(); 
f.doChecksbeforeDownload(); 

我想doChecksbeforeDownload()等到clientUloadStringCompleted完成。

我該如何告訴doChecksbeforeDownload等待,直到DownloadFilesAsync中的異步調用完成並準備就緒。

  1. 呼叫doChecksbeforeDownload()
  2. ChecksbeforeDownload() - > DownloadFileAsync()
  3. ChecksbeforeDownload() - >等待.......
  4. DownloadFileAsync() - > Completet &就緒
  5. ChecksbeforeDownload() - >返回FOO爲主類

是否有任何最佳實踐/示例來實現這一目標?我堅持這一點。

在此先感謝

漢納斯

回答

4

您將需要使用.NET中公開的同步對象。

結賬this link。以下是摘錄:

class BasicWaitHandle 
{ 
    static EventWaitHandle _waitHandle = new AutoResetEvent (false); 

    static void Main() 
    { 
    new Thread (Waiter).Start(); 
    Thread.Sleep (1000);     // Pause for a second... 
    _waitHandle.Set();     // Wake up the Waiter. 
    } 

    static void Waiter() 
    { 
    Console.WriteLine ("Waiting..."); 
    _waitHandle.WaitOne();    // Wait for notification 
    Console.WriteLine ("Notified"); 
    } 
} 

注意:小心使重置事件靜態等等。然後您將介紹線程安全問題。上面的例子只是簡單的靜態的。

在你的情況,你想讓autoreset事件成爲你的類的一個正在執行異步的成員。在你的函數中,在你開始異步調用之後,等待你的句柄。在完成事件中,設置應該取消阻止等待句柄的事件。

想想看,你可能要爲大家介紹的超時爲調用了WaitOne()等

+0

這是IT!謝謝 – 2011-06-17 07:28:37

0

我只是吐在這裏起球,但這個怎麼樣:

In DownloadFileAsync() set a flag like DownloadInProgress 

In doChecksbeforeDownload 
    If DownloadInProgress Then set flag WaitingForDownloadCompletion 
    Else Continue 

In client_UploadStringCompleted() 
    Set DownloadInProgress = false 
    If WaitingForDownloadCompletion Then call doChecksbeforeDownload() 
+0

你打我一記重拳:) – 2011-06-16 19:36:20

+0

我能做到這一點的一個簡單的while循環?或者我是否必須在自己的線程中使用它並觀察它是否正在運行? 在doChecksbefore下載 如果DownloadInProgress然後設置標誌WaitingForDownloadCompletion 否則繼續 – 2011-06-17 05:55:45

+0

不需要循環。當下載完成時,它觸發UploadStringCompletedEventHandler。你寫的代表然後調用doChecksbeforeDownload,但現在標誌着下載已經在進行中,已經被清除了,所以它可以繼續其餘的工作。 – NatX 2011-06-17 15:17:55

0

您可以在classlevel創建一個布爾變量像

bool isFinished = false;

然後讓你的異步設置這個值爲真,一旦完成。

然後將isFinished變量公開爲公共值。

+0

嗨,感謝您的回答:與之前的一條評論相同的問題: 我可以在簡單的WHILE循環中執行此操作嗎?或者我是否必須在自己的線程中使用它並觀察它是否正在運行? – 2011-06-17 05:59:12

+0

你可以使用while循環,但你的CPU負載。在while循環中運行查詢或其他方法可能會輕鬆佔用您的資源。考慮使用thread.sleep來避免檢查所有的時間。 – 2011-06-17 12:05:08

1

你應該尋找一些WaitHandle派生類來完成任務。

我會用ManualResetEvent,因爲我認爲它是最簡單的一個。