c# - 控制台应用程序在异步调用完成之前终止

标签 c# asynchronous webclient windows-console

我目前正在编写一个 C# 控制台应用程序,它生成许多指向网站上不同图像的 URL,然后使用 WebClient.DownloadDataAsync() 作为字节流下载。

我的问题是,一旦进行了第一个异步调用,控制台应用程序就会认为程序已完成并在异步调用返回之前终止。通过使用 Console.Read(),我可以强制控制台保持打开状态,但这似乎不是一个很好的设计。此外,如果用户在此过程中按下回车键(当控制台正在等待输入时),程序将终止。

有没有更好的方法来防止在等待异步调用返回时关闭控制台?

编辑:调用是异步的,因为我在下载发生时通过控制台向用户提供状态指示器。

最佳答案

是的。使用ManualResetEvent ,并让异步回调调用 event.Set()。如果 Main 例程在 event.WaitOne() 上阻塞,它将在异步代码完成之前不会退出。

基本的伪代码如下所示:

static ManualResetEvent resetEvent = new ManualResetEvent(false);

static void Main()
{
     CallAsyncMethod();
     resetEvent.WaitOne(); // Blocks until "set"
}

void DownloadDataCallback()
{
     // Do your processing on completion...

     resetEvent.Set(); // Allow the program to exit
}

关于c# - 控制台应用程序在异步调用完成之前终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3840795/

相关文章:

javascript - 如何在 Gulp 4 中使用异步/等待?

c# - VSTO Outlook 嵌入图像 MailItem

c# - 从主 Viewmodel 调用 subview 模型方法

c# - 创建和更新 UI 元素 Async Wpf

c# - 通过代理的 HTTPS 不起作用

c# - 端口号和 URL

C# WebClient OpenRead url

c# - 如何以最少的访问量(最有效)从位置FIFO中选择项目

c# - 在 UML 中显示 "Protected Internal"?

multithreading - 等待有时间限制的线程加入