.net的简易多线程处理
这篇文章是对几年前写的<Task及其异常处理的若干事项>的一些狗尾续貂的补充。
更简单的写法
几年前写的那篇文章很详细地描述了.net用Task对线程进行封装的相关技术。开一个新的线程去执行一个任务,当时是这么写的:
Task taskA = Task.Factory.StartNew(() =>{ //Do something... });
现在还有一种更简单的写法:
Task.Run(() => { //Do something... });
延迟执行
另外还有“延迟执行”,啥叫延迟执行?就是:多少时间后,给我执行这个动作!
Task.Delay(mSec).ContinueWith(_ => { //Do something... });
延迟执行后在UI线程中执行某个操作(通常是更新界面)。
Task.Delay(mSec).ContinueWith(_ => { //Do UI update operation }, TaskScheduler.FromCurrentSynchronizationContext());
UI更新
这样开线程执行任务的话是不能操作UI上的元素,那如何操作UI上的元素?(以WPF为例)
Dispatcher.BeginInvoke((Action)(() => { //Do UI operation here... }));
闭包(Closure)
另外还可以实现“闭包”,即Task这段代码访问它外部的变量:
int value = 10; Task.Run(() => { Debug.WriteLine("value is " + value); });
说到闭包,要记住这里有个坑:
for (int i = 0; i < 10; i++) { Task.Run(() => { Debug.WriteLine("i value is " + i); }); }
输出全是10,想输出1-9,有两种办法,1是赋值一个局部变量:
for (int i = 0; i < 10; i++) { int j=i; Task.Run(() => { Debug.WriteLine("i value is " + j); }); }
另一种方法是用foreach:
int[] arr = {0,1,2,3,4,5,6,7,8,9}; foreach (int i in arr) { Task.Run(() => { Debug.WriteLine("i value is " + i); }); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人