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调用完成并准备好。
是否有最佳实践/示例来实现这一目标?我坚持这一点。
提前致谢
汉尼斯
您将要使用.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()等引入超时。
| 归档时间: |
|
| 查看次数: |
4607 次 |
| 最近记录: |