c# - 等待类方法完成 C#

标签 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);
     ...
     ...
}

完成后调用 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() -> 完成并就绪
  5. ChecksbeforeDownload()->将 FOO 返回给主类

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

提前致谢

汉内斯

最佳答案

您将希望使用 .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");
  }
}

注意:小心将重置事件设置为静态等。这样您就会引入线程安全问题。为简单起见,上面的示例只是静态的。

在您的情况下,您希望使自动重置事件成为执行异步的类的成员。在您的函数中,启动异步调用后,等待您的句柄。在完成事件中,设置应该解锁等待句柄的事件。

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

关于c# - 等待类方法完成 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6377286/

相关文章:

python - 从同步 View 调用的异步函数中的 Django 模型属性

ios - 我们可以将自定义 header 添加到 Alamofire 文件下载 : IOS/SWIFT

c# - 读取字节数组中的多个文件

C# 枚举到 postgres 枚举

c# - 何时不使用 OpenId 连接

javascript - 下载的文件会保存两次吗?

javascript - 开始多次下载并在出现下载提示窗口时获得反馈

c# - ASP.NET 将数据类型 nvarchar 转换为数字时出错

c# - 对 Controller 中的所有操作使用 async/await?

javascript - 如何在 JS 的 setInterval 中等待?