等待类方法完成C#

时间:2011-06-16 19:14:25

标签: 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);
     ...
     ...
}

并在完成后调用client_UploadStringCompleted()方法:

void client_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
    {
       //Do Check here
    }

到目前为止一切顺利。现在我将所有这些放在“函数”类中,并像这样调用Method:

 Functions f = new Functions();
 f.doChecksbeforeDownload();

我希望doChecksbeforeDownload()等到clientUloadStringCompleted完成。

如何告诉doChecksbeforeDownload等到DownloadFilesAsync中的Async调用完成并准备就绪。

  1. 致电doChecksbeforeDownload()
  2. ChecksbeforeDownload() - > DownloadFileAsync()
  3. ChecksbeforeDownload() - >等待.......
  4. DownloadFileAsync() - >完整与完善就绪
  5. ChecksbeforeDownload() - >返回FOO到主类
  6. 有没有最佳实践/示例来实现这一目标?我坚持这一点。

    提前致谢

    汉纳斯

4 个答案:

答案 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变量公开为公共值。