C#中几种多线程调用方式

1. 样例代码

cs 复制代码
public class TestTasks
{
    //1. 无参 无返回值
    public void Task1()
    {
        Debug.WriteLine("-------Task1.Start...");
        Thread.Sleep(3000);
        Debug.WriteLine("-------Task1.End...");
    }
    //2. 有参 无返回值
    public void Task2(int param)
    {
        Debug.WriteLine("-------Task2.Start..." + param);
        Thread.Sleep(3000);
        Debug.WriteLine("-------Task2.End...");
    }
    //3. 有参 有返回值
    public int Task3(int param)
    {
        Debug.WriteLine("-------Task3.Start..." + param);
        Thread.Sleep(3000);
        Debug.WriteLine("-------Task3.End...");
        return param + 1;
    }
}

2. 方式1:Task 方式(推荐)

cs 复制代码
TestTasks tt = new TestTasks();

//t1:
Task t1 = Task.Factory.StartNew(tt.Task1);

//t2: 传参用lambda表达式
Task t2 = Task.Factory.StartNew(() => tt.Task2(102));

//等待 t1 t2 执行完成之后,再执行 t3.
Task.WaitAll(t1, t2);

//t3: 带返回值
Task<int> t3 = Task.Factory.StartNew(() => tt.Task3(103));  
Debug.WriteLine("-------t3: " + t3.Result);

3. 方式2:Async / Await 方式 (较为推荐)

cs 复制代码
TestTasks tt = new TestTasks();

//添加 await,  Task 依次执行。 
await Task.Factory.StartNew(tt.Task1);

await Task.Factory.StartNew(() => tt.Task2(102));

var result = await Task.Factory.StartNew(() => tt.Task3(103));  
Debug.WriteLine("-------t3: " + result);

4. 方式3:创建线程

cs 复制代码
TestTasks tt = new TestTasks();
new Thread(tt.Task1).Start();
//针对有参数的任务,需要用Lambda进行包装或者使用ParameterizedThreadStart对象. 
new Thread(x => tt.Task2((int)x)).Start(100);
//但是无法执行带返回值的方法。

5. 方式4:线程池

cs 复制代码
TestTasks tt = new TestTasks();
ThreadPool.QueueUserWorkItem(o => tt.Task1());
ThreadPool.QueueUserWorkItem(o => tt.Task2(102));
ThreadPool.QueueUserWorkItem(o => tt.Task3(103));
相关推荐
影寂ldy3 小时前
C# try-catch 异常处理全套笔记
服务器·数据库·c#
TeamDev4 小时前
JxBrowser 9.3.0 版本发布啦!
java·后端·c#·混合应用·jxbrowser·浏览器控件·异步媒体设备
梦帮科技4 小时前
UE5 GAS 实战:用 Gameplay Ability System 搭建「赛博修真」境界与技能体系
c++·人工智能·python·ue5·c#
北域码匠8 小时前
RIPEMD-128哈希算法深度解析
c#·密码学·哈希算法·加密算法·消息摘要·ripemd-128·原生实现
csdn_aspnet10 小时前
C# 截取或匹配字符串内包含指定字符
c#·字符串·正则·string·匹配·截取
hez20104 天前
在 .NET 上构建超大托管数组
c#·.net·.net core·gc·clr
雨落倾城夏未凉9 天前
第四章c#方法-参数数组和可选参数(16)
后端·c#
唐青枫10 天前
线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
c#·.net
唐青枫11 天前
别只会反射:C#.NET Emit 动态生成代码实战详解
c#·.net
咕白m62512 天前
.NET 环境下 Word 超链接批量提取方案
c#·.net