static CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken token = tokenSource.Token;
ManualResetEvent resetEvent = new ManualResetEvent(true);
public Form1()
{
InitializeComponent();
}
private async void button1_Click(object sender, EventArgs e)
{
#region 异步 暂停 继续 取消 结束回调 (不阻塞界面)
Task task = new Task(async () =>
{
while (true)
{
if (token.IsCancellationRequested)//是否取消线程
{
return;
}
resetEvent.WaitOne();//是否阻塞线程
Test();
Console.WriteLine("加法之后的输出!!!");
// 模拟等待100ms
await Task.Delay(100);
}
}, token, TaskCreationOptions.None);
task.Start();
//异步等待返回,不阻塞界面
await task.ContinueWith( (t) =>
{
//获取线程返回
Console.WriteLine("任务完成回调,完成时候的状态为:");
Console.WriteLine("IsCanceled={0}\tIsCompleted={1}\tIsFaulted={2}", task.IsCanceled, task.IsCompleted, task.IsFaulted);
});
#endregion
#region 任务返回值,长时间运行任务,任务等待完成(阻塞界面不能拖动)
//带返回值的不能用async,不使用 async 阻塞界面
//Task<int> task = new Task<int>(() =>
//{
// while (true)
// {
// if (token.IsCancellationRequested)//是否取消线程
// {
// return 1;
// }
// resetEvent.WaitOne();//是否阻塞线程
// Test();
// Console.WriteLine("加法之后的输出!!!");
// // 模拟等待100ms
// return 2;
// } //标记为长时间运行任务,则任务不会使用线程池,而在单独的线程中运行。
//}, token, TaskCreationOptions.LongRunning);
//task.Start();
//task.ContinueWith((t) =>
//{
// //获取线程返回
// Console.WriteLine("任务完成回调,完成时候的状态为:");
// Console.WriteLine("IsCanceled={0}\tIsCompleted={1}\tIsFaulted={2}", task.IsCanceled, task.IsCompleted, task.IsFaulted);
//});
//task.Wait();//等待任务完成
//Console.WriteLine("任务完成,返回值" + task.Result);
#endregion
#region 设置在主线程运行,阻塞界面
////
//Task task = new Task(async () =>
//{
// while (true)
// {
// if (token.IsCancellationRequested)//是否取消线程
// {
// return ;
// }
// resetEvent.WaitOne();//是否阻塞线程
// Test();
// Console.WriteLine("加法之后的输出!!!");
// await Task.Delay(1);
// } //标记为长时间运行任务,则任务不会使用线程池,而在单独的线程中运行。
//}, token, TaskCreationOptions.LongRunning);
////task.RunSynchronously();//设置在主线程运行,阻塞界面
//task.Start();
#endregion
#region 任务串行,并行
//task1先串行
//Task task1 = Task.Factory.StartNew(async () =>
//{
// Test(1);
// Test(2);
// await Task.Delay(100);
//});
////t2,t3并行执行
//Task t2 = task1.ContinueWith(async t =>
//{
// Test(3);
// Console.WriteLine("Task t2 result={0},Thread id {1}", task1.IsCompleted, Thread.CurrentThread.ManagedThreadId);
// await Task.Delay(100);
//});
////t2,t3并行执行
//Task t3 = task1.ContinueWith(async t =>
//{
// Test(4);
// Console.WriteLine("Task t3 result={0},Thread id {1}", task1.IsCompleted, Thread.CurrentThread.ManagedThreadId);
// await Task.Delay(100);
//});
////等待t2和t3执行完
//Task.WaitAll(t2, t3);
////t7串行执行
//var t4 = Task.Factory.StartNew(() =>
//{
// Console.WriteLine("当前集合元素个数:{0},Thread id {1}", task1.IsCompleted, Thread.CurrentThread.ManagedThreadId);
//});
//t4.Wait();
#endregion
#region 任务中的异常
//try
//{
// Task task = new Task(async () =>
// {
// while (true)
// {
// if (token.IsCancellationRequested)//是否取消线程
// {
// return;
// }
// resetEvent.WaitOne();//是否阻塞线程
// TestException(1);
// Console.WriteLine("加法之后的输出!!!");
// await Task.Delay(1);
// } //标记为长时间运行任务,则任务不会使用线程池,而在单独的线程中运行。
// }, token, TaskCreationOptions.LongRunning);
// task.Start();
//}
//catch (Exception ex)
//{
// throw;
//}
//task.RunSynchronously();//设置在主线程运行,阻塞界面
#endregion
#region 更新进度条
//当前线程
//var progress = new Progress<int>(percent =>
//{
// Console.Clear();
// Console.Write("{0}%", percent);
//});
////线程池线程
////Task.Run(async () => DoProcessing(progress));//界面拖动卡顿
//await Task.Run(() => DoProcessing(progress));//界面拖动卡顿
//Console.WriteLine("");
//Console.WriteLine("结束");
#endregion
#region 设置线程优先级
//TaskScheduler scheduler = TaskScheduler.FromCurrentSynchronizationContext();
////
//var task = new Task(async () =>
//{
// //设置线程优先级
// Thread.CurrentThread.Priority = ThreadPriority.Lowest;
// while (true)
// {
// if (token.IsCancellationRequested)//是否取消线程
// {
// return;
// }
// resetEvent.WaitOne();//是否阻塞线程
// for (int g = 0; g < 20; g++)
// {
// label1.Text = "测试Id:" + g;
// Console.WriteLine("测试Id:" + g);
// Thread.Sleep(1000);
// }
// Test();
// Console.WriteLine("加法之后的输出!!!");
// await Task.Delay(1);
// } //标记为长时间运行任务,则任务不会使用线程池,而在单独的线程中运行。
//}, CancellationToken.None, TaskCreationOptions.None);
////task.RunSynchronously();//设置在主线程运行,阻塞界面
//task.Start();
#endregion
}
private void Test()
{
int a = 0;
for (int i = 0; i < 20; i++)
{
resetEvent.WaitOne();//是否阻塞线程
Thread.Sleep(2000);
a = a += 1;
Console.WriteLine($"测试加法{a}");
if (token.IsCancellationRequested)//线程是否取消
{
return;
}
}
}
private void Test(int Rows)
{
Console.WriteLine("任务执行" + Rows);
int a = 0;
for (int i = 0; i < 20; i++)
{
resetEvent.WaitOne();//是否阻塞线程
Thread.Sleep(2000);
a = a += 1;
Console.WriteLine($"测试加法{a}");
if (token.IsCancellationRequested)//线程是否取消
{
return;
}
}
}
private void TestException(int Rows)
{
Console.WriteLine("任务执行" + Rows);
int a = 0;
for (int i = 0; i < 20; i++)
{
resetEvent.WaitOne();//是否阻塞线程
Thread.Sleep(2000);
a = a += 1;
Console.WriteLine($"测试加法{a}");
if (token.IsCancellationRequested)//线程是否取消
{
return;
}
}
throw new Exception("Boom!");
}
void DoProcessing(IProgress<int> progress)
{
for (int i = 0; i <= 100; ++i)
{
Thread.Sleep(100);
if (progress != null)
{
progress.Report(i);
}
}
}
async Task Display()
{
//当前线程
var progress = new Progress<int>(percent =>
{
Console.Clear();
Console.Write("{0}%", percent);
});
//线程池线程
await Task.Run(() => DoProcessing(progress));
Console.WriteLine("");
Console.WriteLine("结束");
}
private void Button_Click_1(object sender, EventArgs e)
{
Console.WriteLine("点击暂停");
resetEvent.Reset();//暂停Task
}
private void Button_Click_2(object sender, EventArgs e)
{
Console.WriteLine("点击继续");
resetEvent.Set();//继续
}
private void Button_Click_3(object sender, EventArgs e)
{
Console.WriteLine("点击取消");
tokenSource.Cancel();//取消
}