我需要从 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 中的异步调用完成并准备就绪。
- 调用 doChecksbeforeDownload()
- ChecksbeforeDownload()->DownloadFileAsync()
- ChecksbeforeDownload()->等待......
- DownloadFileAsync() -> 完成并就绪
- 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/