C# task.run开启一个48小时的任务,如何使用CancellationTokenSource来随时可以取消
时间: 2024-09-14 21:12:09 浏览: 49
在C#中,如果你想使用`Task.Run`开启一个长时间运行的任务,并允许在运行过程中通过`CancellationTokenSource`取消它,你可以按照以下步骤操作:
1. 首先,创建一个`CancellationTokenSource`实例,这个令牌源可以用于生成一个可以随时取消的令牌。
```csharp
using System.Threading;
using System.Threading.Tasks;
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken cancellationToken = cts.Token;
```
2. 使用`cts.Token`作为参数启动`Task.Run`任务,这样当`cancellationToken`被取消时,任务会被中断。
```csharp
Task task = Task.Run(() =>
{
while (!cancellationToken.IsCancellationRequested)
{
// 你的长时间运行操作
// ...
if (cancellationToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(5))) // 每隔一段时间检查是否需要取消
{
Console.WriteLine("任务已取消");
break;
}
}
}, cancellationToken);
```
3. 当你需要取消任务时,只需调用`cts.Cancel()`,这将设置`cancellationToken`的状态为`Cancelled`。
```csharp
// 取消任务
if (task.Status == TaskStatus.Running)
{
cts.Cancel();
}
```
4. 当任务完成后,无论是否被取消,都会进入完成状态。你可以添加一个异常处理块来优雅地处理取消导致的异常。
```csharp
task.ContinueWith(t =>
{
if (t.IsCanceled)
{
Console.WriteLine("任务因取消而终止");
}
else if (t.IsFaulted)
{
Console.WriteLine("任务执行时发生错误: " + t.Exception.Message);
}
else
{
Console.WriteLine("任务已完成");
}
});
```
阅读全文