让我来为你详细讲解一下“C#多线程系列之任务基础(三)”的完整攻略。
任务基础(三)
这篇文章主要讲解任务(Task)的一些基本用法,包括如何取消一个任务、如何使用Task.Delay()方法等等。
取消任务
在使用任务的过程中,有时候需要取消一个正在执行的任务。可以使用CancellationTokenSource和CancellationToken来取消任务。
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
Task task = Task.Factory.StartNew(() =>
{
for(int i=0; i<10; i++)
{
Console.WriteLine($"Value:{i},TaskId:{Task.CurrentId}");
Thread.Sleep(1000);
//检查是否取消任务
if(token.IsCancellationRequested)
{
Console.WriteLine("任务取消了。");
throw new OperationCanceledException(token);
}
}
}, token);
//过一段时间后取消任务
Thread.Sleep(3000);
cts.Cancel();
在上面的代码中,首先创建了一个CancellationTokenSource和CancellationToken。然后创建了一个任务,并在任务执行的过程中检查是否取消任务。如果需要取消任务,则抛出OperationCanceledException异常。最后在执行任务的过程中,通过CancellationTokenSource取消了任务。
使用Task.Delay()方法
在需要暂停一段时间后再执行任务的时候,可以使用Task.Delay()方法。
Task task = Task.Factory.StartNew(async () =>
{
for(int i=0; i<5; i++)
{
Console.WriteLine($"Value:{i},TaskId:{Task.CurrentId}");
//暂停1秒后执行下一次任务
await Task.Delay(1000);
}
});
task.Wait();
在上面的代码中,创建了一个任务,并在任务执行的过程中,暂停了1秒钟,然后再执行下一次任务。最后通过调用task.Wait()方法等待任务执行完毕。
示例
下面是一个简单的示例,演示如何取消并且阻止任务:
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
Task task = Task.Factory.StartNew(() =>
{
for(int i=0; i<10; i++)
{
Console.WriteLine($"Value:{i},TaskId:{Task.CurrentId}");
Thread.Sleep(1000);
//检查是否取消任务
if(token.IsCancellationRequested)
{
Console.WriteLine("任务取消了。");
throw new OperationCanceledException(token);
}
}
}, token);
//过一段时间后取消任务
Thread.Sleep(3000);
cts.Cancel();
try
{
task.Wait();
}
catch(AggregateException ex)
{
ex.Handle(e =>
{
if(e is OperationCanceledException)
{
Console.WriteLine(e.Message);
return true;
}
return false;
});
}
在这个示例中,首先创建了一个CancellationTokenSource和CancellationToken,然后创建了一个任务,并在任务执行的过程中检查是否取消任务。在执行任务的过程中,通过CancellationTokenSource取消了任务。最后在调用任务的Wait()方法时捕捉了AggregateException异常,并处理了OperationCanceledException异常。
还有一个示例,演示如何使用Task.Delay()方法:
Task task = Task.Factory.StartNew(async () =>
{
for(int i=0; i<5; i++)
{
Console.WriteLine($"Value:{i},TaskId:{Task.CurrentId}");
//暂停1秒后执行下一次任务
await Task.Delay(1000);
}
});
task.Wait();
在这个示例中,首先创建了一个任务,并在任务执行的过程中暂停了1秒钟,然后再执行下一次任务。最后通过调用task.Wait()方法等待任务执行完毕。
以上就是“C#多线程系列之任务基础(三)”的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#多线程系列之任务基础(三) - Python技术站