1、线程分为前台线程和后台线程,应用程序在所有前台线程结束后退出。
2、使用Thread创建前台线程:
Thread t1 = new Thread(Function1);
t1.Start();
private static void Function1()
{
Thread.Sleep(1000);//模拟耗时操作,睡眠1s
Console.WriteLine("前台线程被调用!");
}
3、使用Thread创建带参数的后台线程
Thread t2= new Thread(new ParameterizedThreadStart(Function2));
t2.IsBackground = true;//设置为后台线程
t2.Start("传参");
private static void Function2(object data)
{
Thread.Sleep(2000);//模拟耗时操作,睡眠2s
Console.WriteLine("后台线程被调用!" + data);
}
4、使用ThreadPool创建后台线程
Console.WriteLine("主线程开始!");
//创建要执行的任务
WaitCallback workItem = state => Console.WriteLine("当前线程Id为:" + Thread.CurrentThread.ManagedThreadId);
//重复调用10次
for (int i = 0; i < 10; i++)
{
ThreadPool.QueueUserWorkItem(workItem);
}
Console.ReadLine();
5、并行For循环
ParallelLoopResult result = Parallel.For(0, 100, i => {
Console.WriteLine("{0}, task: {1} , thread: {2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
});
6、启动Task
- 方式一:
Task.Factory.StartNew(() => Console.WriteLine("Task running."));
- 方式二:
Task.Run(() => Console.WriteLine("Task running."));
- 接收返回值的Task
Console.WriteLine("主线程ID:" + Thread.CurrentThread.ManagedThreadId);
Task<string> task = Task.Run(() =>
{
return Thread.CurrentThread.ManagedThreadId.ToString();
});
Console.WriteLine("创建Task对应的线程ID:" + task.Result);
Console.ReadLine();
7、async/await异步编程
static void Main(string[] args)
{
//主线程调用AsyncCaller方法,被async标记的方法将会在合适的时候异步执行
var task = AsyncCaller();
//主线程调用task.Result等待异步执行结果
Console.WriteLine(task.Result); //3
Console.ReadKey();
}
private static async Task<string> AsyncCaller()
{
//await标记了一个等待点
var str = await AsyncFunction(); //2
return str;
}
private static Task<string> AsyncFunction()
{
//下面就是将要被异步执行的任务,主线程到这里就会返回
return Task.Run(() => //1
{
return "AsyncFunction()执行完毕";
});
}
主线程执行到1处后,函数AsyncFunction
返回,接着AsyncCaller
直接从2处返回,并执行到3处等待。异步线程执行完毕后,返回到2处,继续向后执行,返回值传递给task.Result
,异步线程结束。
参考资料
.Net异步编程知多少 圣杰