等待类方法完成C#
我需要从Https源文件下载文件。 我会做这个asynchron这样的(作品至今):完成后等待类方法完成C#
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() - > Completet &就绪
- 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");
}
}
注意:小心使重置事件静态等等。然后您将介绍线程安全问题。上面的例子只是简单的静态的。
在你的情况,你想让autoreset事件成为你的类的一个正在执行异步的成员。在你的函数中,在你开始异步调用之后,等待你的句柄。在完成事件中,设置应该取消阻止等待句柄的事件。
想想看,你可能要为大家介绍的超时为调用了WaitOne()等
我只是吐在这里起球,但这个怎么样:
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()
你打我一记重拳:) – 2011-06-16 19:36:20
我能做到这一点的一个简单的while循环?或者我是否必须在自己的线程中使用它并观察它是否正在运行? 在doChecksbefore下载 如果DownloadInProgress然后设置标志WaitingForDownloadCompletion 否则继续 – 2011-06-17 05:55:45
不需要循环。当下载完成时,它触发UploadStringCompletedEventHandler。你写的代表然后调用doChecksbeforeDownload,但现在标志着下载已经在进行中,已经被清除了,所以它可以继续其余的工作。 – NatX 2011-06-17 15:17:55
您可以在classlevel创建一个布尔变量像
bool isFinished = false;
然后让你的异步设置这个值为真,一旦完成。
然后将isFinished变量公开为公共值。
嗨,感谢您的回答:与之前的一条评论相同的问题: 我可以在简单的WHILE循环中执行此操作吗?或者我是否必须在自己的线程中使用它并观察它是否正在运行? – 2011-06-17 05:59:12
你可以使用while循环,但你的CPU负载。在while循环中运行查询或其他方法可能会轻松占用您的资源。考虑使用thread.sleep来避免检查所有的时间。 – 2011-06-17 12:05:08
这是IT!谢谢 – 2011-06-17 07:28:37