我需要从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
}
到目前为止一切顺利。现在我将所有这些放在“函数”类中,并像这样调用Method:
Functions f = new Functions();
f.doChecksbeforeDownload();
我希望doChecksbeforeDownload()等到clientUloadStringCompleted完成。
如何告诉doChecksbeforeDownload等到DownloadFilesAsync中的Async调用完成并准备就绪。
有没有最佳实践/示例来实现这一目标?我坚持这一点。
提前致谢
汉纳斯
答案 0 :(得分: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()等的调用引入超时。
答案 1 :(得分:1)
您应该寻找一些WaitHandle
派生类来完成任务。
我会使用ManualResetEvent,因为我认为这是最简单的一个。
答案 2 :(得分: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()
答案 3 :(得分:0)
您可以在类级别
创建一个bool变量bool isFinished = false;
然后让async在完成后将此值设置为true。
然后将isFinished变量公开为公共值。