And*_*ler 37 c# asynchronous webclient windows-console
我目前正在编写一个C#控制台应用程序,它会生成许多指向网站上不同图像的URL,然后使用下载作为字节流WebClient.DownloadDataAsync()
.
我的问题是,一旦进行了第一次异步调用,控制台应用程序会认为程序已完成并在异步调用返回之前终止.通过使用Console.Read()
我可以强制控制台保持打开,但这似乎不是很好的设计.此外,如果用户在进程期间点击进入(当控制台正在等待输入时),程序将终止.
在等待异步调用返回时,是否有更好的方法可以阻止控制台关闭?
编辑:调用是异步的,因为我在下载过程中通过控制台向用户提供状态指示器.
Ree*_*sey 48
是.使用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
}
Run Code Online (Sandbox Code Playgroud)
Cam*_*and 27
另一个选择是只调用异步Main方法并等待返回的任务.
static void Main(string[] args)
{
MainAsync(args).Wait();
}
static async Task MainAsync(string[] args)
{
// .. code goes here
}
Run Code Online (Sandbox Code Playgroud)
从.NET 4.5开始,您现在可以调用 GetAwaiter().GetResult()
static void Main(string[] args)
{
MainAsync(args).GetAwaiter().GetResult();
}
Run Code Online (Sandbox Code Playgroud)
.Wait()和.GetAwaiter()之间有什么区别.GetResult()?
如果这是您的所有应用程序正在进行的操作,我建议不要进行异步调用; 您特别希望应用程序在下载完成之前"挂起",因此使用异步操作与此处的操作相反,尤其是在控制台应用程序中.
归档时间: |
|
查看次数: |
12703 次 |
最近记录: |