等待类方法完成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中的异步调用完成并准备就绪。

  1. 呼叫doChecksbeforeDownload()
  2. ChecksbeforeDownload() - > DownloadFileAsync()
  3. ChecksbeforeDownload() - >等待.......
  4. DownloadFileAsync() - > Completet &就绪
  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"); 
    } 
} 

注意:小心使重置事件静态等等。然后您将介绍线程安全问题。上面的例子只是简单的静态的。

在你的情况,你想让autoreset事件成为你的类的一个正在执行异步的成员。在你的函数中,在你开始异步调用之后,等待你的句柄。在完成事件中,设置应该取消阻止等待句柄的事件。

想想看,你可能要为大家介绍的超时为调用了WaitOne()等

+0

这是IT!谢谢 – 2011-06-17 07:28:37

我只是吐在这里起球,但这个怎么样:

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() 
+0

你打我一记重拳:) – 2011-06-16 19:36:20

+0

我能做到这一点的一个简单的while循环?或者我是否必须在自己的线程中使用它并观察它是否正在运行? 在doChecksbefore下载 如果DownloadInProgress然后设置标志WaitingForDownloadCompletion 否则继续 – 2011-06-17 05:55:45

+0

不需要循环。当下载完成时,它触发UploadStringCompletedEventHandler。你写的代表然后调用doChecksbeforeDownload,但现在标志着下载已经在进行中,已经被清除了,所以它可以继续其余的工作。 – NatX 2011-06-17 15:17:55

您可以在classlevel创建一个布尔变量像

bool isFinished = false;

然后让你的异步设置这个值为真,一旦完成。

然后将isFinished变量公开为公共值。

+0

嗨,感谢您的回答:与之前的一条评论相同的问题: 我可以在简单的WHILE循环中执行此操作吗?或者我是否必须在自己的线程中使用它并观察它是否正在运行? – 2011-06-17 05:59:12

+0

你可以使用while循环,但你的CPU负载。在while循环中运行查询或其他方法可能会轻松占用您的资源。考虑使用thread.sleep来避免检查所有的时间。 – 2011-06-17 12:05:08

你应该寻找一些WaitHandle派生类来完成任务。

我会用ManualResetEvent,因为我认为它是最简单的一个。