一个有意思的问题:
假设一个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();
添加此行代码后,程序在被调用时会始终等待异步处理结果,一旦处理完成,则会自动结束程序。