winform+Task+async
一个有意思的问题:
假设一个winform程序,需要运行异步任务进行业务处理,那么最常见的实践方式是怎样的?
那肯定是task+async呀,对,就是这样,但如果想让windows 挂载这个程序,使用命令行运行,那么原有的方法还可行吗?比如以下代码:
private void Form1_Load(object sender, EventArgs e) { LogHelper.WriteLog("", "", "Form1_Load"); var args = Environment.GetCommandLineArgs(); if (args != null && args.Length> 1) { if (args.Contains("-a")) { Task ts = Task.Run(async () => { //... }); ts.ContinueWith(t => { LogHelper.WriteLog("", "", "end"); Application.Exit(); }); } } }
答案是不行的,因为task运行的是异步任务,那么这个异步任务是交给后台线程处理的,而task会立即返回,从而触发ContinueWith,从而关闭整个程序。
而理解了这一点,就会明白了,其实非常简单,既然是task运行异步任务,那么就在异步任务运行后再执行ContinueWith好了,于是在task后添加一行代码:
ts.Wait();
添加此行代码后,程序在被调用时会始终等待异步处理结果,一旦处理完成,则会自动结束程序。
浙公网安备 33010602011771号