如何在C#中使用CancellationToken实现线程超时并能够成功地从另一个线程中取消其执行?
时间: 2024-11-29 09:37:05 浏览: 16
在C#中,你可以通过`CancellationToken`和`Task`的`CancellationTokenSource`来实现线程超时并支持取消操作。首先,你需要创建一个`CancellationTokenSource`,它会提供一个可以用于取消任务的令牌。以下是一个简单的步骤:
1. 创建一个`CancellationTokenSource`实例:
```csharp
CancellationTokenSource cts = new CancellationTokenSource();
```
2. 当需要启动一个新的异步任务时,将`CancellationToken`作为参数传递:
```csharp
Task task = MyAsyncMethodAsync(cts.Token);
```
在这里,`MyAsyncMethodAsync`是你自定义的一个异步方法。
3. 如果你想设置一个超时时间,可以在`CancellationTokenSource`上调用`CancelAfter`方法:
```csharp
cts.CancelAfter(TimeSpan.FromSeconds(60)); // 设置60秒超时
```
4. 在异步方法内部检查`CancellationToken.IsCancellationRequested`属性,如果请求被取消,则提前返回或采取其他相应措施:
```csharp
try
{
await SomeLongRunningOperationAsync();
}
catch (OperationCanceledException)
{
Console.WriteLine("Task was canceled.");
}
finally
{
cts.Dispose(); // 确保资源被释放
}
```
5. 在另一个线程中,如果你想取消这个任务,只需调用`CancellationTokenSource.Cancel()`:
```csharp
// 另一线程想取消任务
cts.Cancel();
```
阅读全文