gpt4 book ai didi

c# - 等待类方法完成 C#

转载 作者:太空狗 更新时间:2023-10-30 00:56:56 29 4
gpt4 key购买 nike

我需要从 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
}

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

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

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

如何告诉 doChecksbeforeDownload 等待 DownloadFilesAsync 中的异步调用完成并准备就绪。

  1. 调用 doChecksbeforeDownload()
  2. ChecksbeforeDownload()->DownloadFileAsync()
  3. ChecksbeforeDownload()->等待......
  4. DownloadFileAsync() -> 完成并就绪
  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");
}
}

注意:小心将重置事件设置为静态等。这样您就会引入线程安全问题。为简单起见,上面的示例只是静态的。

在您的情况下,您希望使自动重置事件成为执行异步的类的成员。在您的函数中,启动异步调用后,等待您的句柄。在完成事件中,设置应该解锁等待句柄的事件。

考虑到您可能希望为 WaitOne() 等调用引入超时。

关于c# - 等待类方法完成 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6377286/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com