一,task
1,//创建奇数线程池
ManualResetEvent mreset = new ManualResetEvent(false);
Task task1 = new Task(e =>
{
Os(e);
mreset.Set();
}, 10);
task1.Start();
public static void Os(object e)
{
int x = Convert.ToInt32(e);
for (int i = 1; i <= x; i += 2)
{
Console.WriteLine("奇数: " + i);
Thread.Sleep(500);
}
}
mreset.WaitOne();
// 创建偶数线程池
ManualResetEvent mreset1 = new ManualResetEvent(false);
Task task2 = new Task(e =>
{
Js(e);
mreset1.Set();
}, 10);
task2.Start();
public static void Js(object e)
{
int x = Convert.ToInt32(e);
for (int i = 2; i <= x; i += 2)
{
Console.WriteLine("偶数: " + i);
Thread.Sleep(500);
}
}
mreset1 .WaitOne();
// 创建奇数线程池
ManualResetEvent mreset = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(e =>
{
int x = Convert.ToInt32(e);
for (int i = 1; i <= x; i += 2)
{
Console.WriteLine("奇数: " + i);
Thread.Sleep(500);
}
mreset.Set();
}, 10);
// 创建偶数线程池
ManualResetEvent mreset1 = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(e =>
{
int x = Convert.ToInt32(e);
for (int i = 2; i <= x; i += 2)
{
Console.WriteLine("偶数: " + i);
Thread.Sleep(500);
}
mreset1.Set();
}, 10);
//等待子线程运行结束
mreset.WaitOne();
mreset1.WaitOne();
2,task.Wait(); 等待task任务完成之后执行后续 线程代码
等待所有线程执行完毕后再执行主线内容
Task.WaitAll(task, task2, task3,task4);
等待所有线程中至少有一个执行完毕后再执行主线内容
Task.WaitAny(task, task2, task3, task4);
二,Task.ContinueWith 线程延续
例子1: //如果线程中的结果 需要再后续使用 使用线程延续
Task<int> task4 = new Task<int>(() =>
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ":task4");
return 120;
});
task4.Start();
task4.ContinueWith(e =>
{
//获取task4线程ID
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ";ContinueWith");
//获取task4 完成后的返回值结果
Console.WriteLine(e.Result);
int b = 10;
Console.WriteLine(b + e.Result);
});
//1.初始化线程取消类
CancellationTokenSource tokenSource = new CancellationTokenSource();
//2.获取线程取消标记
CancellationToken token = tokenSource.Token;
Task.Run(() => {
for (var i = 0; i < 1000; i++)
{
Thread.Sleep(1000);
Console.WriteLine(i);
//是否执行取消方法 如果取消 为true 反之为 false
// tokenSource.Cancel(); 作用就是让token.IsCancellationRequested 为true
//token.IsCancellationRequested 默认值为false
if (token.IsCancellationRequested)
{
Console.WriteLine("取消请求已发出");
//return 才是真正结束线程方式
return;
}
}
},token);
//取消线程方法
tokenSource.Cancel();
三,如何通过使用async/await 完成异步编程
1.async 必须修饰方法 被修饰的方法 表示是一个异步方法
public async static void ProgramMothod1()
{
Console.WriteLine("ProgramMothod1开始执行");
//await写法一
await ProgramMothod1_1();
Console.WriteLine("ProgramMothod1结束执行");
}
public static Task ProgramMothod1_1()
{
Task task = Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
Thread.Sleep(1000);
Console.WriteLine(i + "ProgramMothod1");
}
});
return task;
}
2.async 和await必须连用 如果不使用await 那么这个方法还是同步方法
3.async 描述的方法 的返回值类型必须是void 或者是task 或者task<T>
4.await 描述的也是方法 但是必须是使用线程(task)的方法
5.async方法在执行的时候,开始是以同步的方式执行,直到遇到await关键字,