C#中的任务和线程
1. Single thread
- 单线程效果,线程卡顿
//---------------------------单线程效果---------------------------
private void button1_Click(object sender, EventArgs e)
{
//总耗时3+5=8秒
Thread.Sleep(3000);
MessageBox.Show("单线程延时三秒执行,主界面有卡顿", "友情提示");
Thread.Sleep(5000);
MessageBox.Show("单线程延时五秒执行,主界面有卡顿", "友情提示");
}
2. Multiple thread
- 用委托或者lambda实现
//---------------------------多线程效果---------------------------
private void button2_Click(object sender, EventArgs e)
{
//thread()里面需要填入一个委托,或者说方法,此处使用lambda表达式,简化程序代码
//运行该线程不会影响到UI线程,即不会卡顿
Thread t = new Thread(() =>
{
//总耗时3+5=8秒
Thread.Sleep(3000);
MessageBox.Show("多线程延时三秒执行,主界面无卡顿", "友情提示");
Thread.Sleep(5000);
MessageBox.Show("多线程延时五秒执行,主界面无卡顿", "友情提示");
});
t.Start();
//如果不用lambda匿名方法,则代码如下
//()中放入方法名,实现调用
// Thread t1 = new Thread(threadfun);
}
3. Task
- 用task来做任务管理,不需要先实例化thread
//---------------------------任务方式实现多线程---------------------------
//推荐用法
private void button3_Click(object sender, EventArgs e)
{
//开启任务方式1.()中直接填入方法名
//Task.Run(threadfun);
//开启任务方式2.匿名表达式
Task.Run(() =>
{
//总耗时3+5=8秒
Thread.Sleep(3000);
MessageBox.Show("任务延时三秒执行,无卡顿", "友情提示");
Thread.Sleep(5000);
MessageBox.Show("任务延时五秒执行,无卡顿", "友情提示");
});
}
4. Synchronization
- 同步执行方法
//------------------------同时多线程运行------------------------
private void button4_Click(object sender, EventArgs e)
{
//同步执行,总耗时5秒
//匿名任务1
Task.Run(() =>
{
Thread.Sleep(3000);
MessageBox.Show("任务1延时三秒执行,无卡顿", "友情提示");
});
//匿名任务2
Task.Run(() =>
{
Thread.Sleep(5000);
MessageBox.Show("任务2延时五秒执行,无卡顿", "友情提示");
});
//两个匿名任务会同时开启
}
5. Await
- 异步方法,方法前用
async
标记,后续任务需要等await
标记任务执行完毕后再执行
//------------------------等待当前任务结束在往下执行(异步方法async)------------------------
//await关键字
private async void button5_Click(object sender, EventArgs e)
{
await Task.Run(() =>
{
Thread.Sleep(3000);
MessageBox.Show("任务延时三秒执行,无卡顿", "友情提示");
Thread.Sleep(5000);
MessageBox.Show("任务延时五秒执行,无卡顿", "友情提示");
});
MessageBox.Show("await:等到两个任务均执行完成后再执行该任务", "友情提示");
}
6. WhenAll
- 等到所有任务结束后再执行
//------------------------等到所有任务结束后再执行------------------------
private void button6_Click(object sender, EventArgs e)
{
//新建一个列表用来存放任务
List<Task> ts = new List<Task>();
//添加任务1
ts.Add(Task.Run(() =>
{
Thread.Sleep(3000);
MessageBox.Show("任务延时三秒执行,无卡顿", "友情提示");
}));
//添加任务2
ts.Add(Task.Run(() =>
{
Thread.Sleep(5000);
MessageBox.Show("任务延时五秒执行,无卡顿", "友情提示");
}));
//WhenAll..continue with
//t表示前一个任务的内容,语句要求必须填写。此处用不到具体内容,留空就行
Task.WhenAll(ts).ContinueWith(t => { MessageBox.Show("WhenAll:等到两个任务均执行完成后再执行该任务", "友情提示"); });
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构