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));
相关推荐
samble16 小时前
从零搭建灌装监控系统(十八):自定义控件,三色灯与状态指示
c#·wpf·mvvm·modbus·工业控制
jun_bai17 小时前
使用Aspose实现word文档合并,内容替换
windows·c#·word
字节暗面20 小时前
客户端上报不可信:游戏服务端数据校验与对局重演设计
c#·游戏开发·服务端校验·反作弊
chingho21 小时前
GitHub上这10个C#项目,不仅实用,还怪好玩的
c#·github·.net·开源项目
半亩码田1 天前
C#转Python第5.1篇:异步编程:asyncio vs async/await,语法相似但机制不同
开发语言·python·c#
阿华田5121 天前
Java 类加载冲突实战:解决 is not an instance of
c#·linq
samble1 天前
从零搭建灌装监控系统(十七):LiveCharts 实时温度曲线
c#·wpf·mvvm·modbus·工业控制
淡海水2 天前
02-07-原理篇-GC暂停时间的本质
开发语言·unity·c#·gc·暂停时间
小羊没烦恼!2 天前
OS X 上使用.NET开发应用程序
开发语言·前端·数据库·人工智能·c#·策略模式
Behavior2 天前
Unity 7.0 Alpha 拆解:编辑器干掉 Mono 换 CoreCLR
c#·unity3d·游戏开发