惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
SegmentFault 最新的问题
N
Netflix TechBlog - Medium
Vercel News
Vercel News
F
Fortinet All Blogs
量子位
博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
MongoDB | Blog
MongoDB | Blog
Y
Y Combinator Blog
GbyAI
GbyAI
博客园 - 三生石上(FineUI控件)
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
月光博客
月光博客
Recent Announcements
Recent Announcements
人人都是产品经理
人人都是产品经理
Hugging Face - Blog
Hugging Face - Blog
D
DataBreaches.Net
H
Help Net Security
阮一峰的网络日志
阮一峰的网络日志
D
Docker
WordPress大学
WordPress大学

博客园 - Shapley

项目心得 进程间通讯方式 C#使用MCP协议调用大模型示例 SQL Server LEAD函数实践 sql server行专列一例 数据库字段排序方法两则 Sql Server生成ULID例子 审批流进化记 献丑贴:Task.Run中foreach优化 Sql Server Begin TRY sample No service for type 'Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.ValidateAntiforgeryTokenAuthorizationFilter' has been registered. 某低代码平台自定义控件技术点 Element-plus的el-date-picker控件动态切换中英文方案 Chrome浏览器无法查看页面跳转前的请求日志及解决办法 element-plus上传视频并生成缩略图(封面)方案 JWT自动刷新草案 Ajax方法POST的两种提交方式 H5项目在微信浏览器运行实录 Sql Server变量声明及使用技巧 修改Dify的Nginx对外访问端口 Task with Console(with SemaphoreSlim) Task实战 asp.net core 9.0发布centos7.9 Barrier CountdownEvent
winform+Task+async
Shapley · 2025-10-19 · via 博客园 - Shapley

一个有意思的问题:

假设一个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后添加一行代码:

添加此行代码后,程序在被调用时会始终等待异步处理结果,一旦处理完成,则会自动结束程序。