等待类方法完成C#

Han*_*hal 4 c# asynchronous download wait

我需要从Https源下载文件。我将像这样进行异步(到目前为止有效):

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);
     ...
     ...
}
Run Code Online (Sandbox Code Playgroud)

并在完成时调用client_UploadStringCompleted()方法:

void client_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
    {
       //Do Check here
    }
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好。现在,我将所有这些都放在“函数”类中,并按如下方式调用方法:

 Functions f = new Functions();
 f.doChecksbeforeDownload();
Run Code Online (Sandbox Code Playgroud)

我希望doChecksbeforeDownload()等到clientUloadStringCompleted完成为止。

我如何告诉doChecksbeforeDownload等待,直到DownloadFilesAsync中的Async调用完成并准备好。

  1. 致电doChecksbeforeDownload()
  2. ChecksbeforeDownload()-> DownloadFileAsync()
  3. ChecksbeforeDownload()->等待...。
  4. DownloadFileAsync()->完成并准备就绪
  5. ChecksbeforeDownload()->将FOO返回到主类

是否有最佳实践/示例来实现这一目标?我坚持这一点。

提前致谢

汉尼斯

Dav*_*son 5

您将要使用.NET中公开的同步对象。

查看此链接。摘录如下:

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");
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:请小心,使重置事件变为静态等。然后,您将介绍线程安全问题。为了简单起见,以上示例仅是静态的。

对于您的情况,您希望使autoreset事件成为执行异步的类的成员。在函数中,启动异步调用后,等待句柄。在完成事件中,设置您的事件,该事件应解除阻止您的等待句柄。

考虑到您可能要为调用WaitOne()等引入超时。