这是我的代码:
public async Task<DefaultEcuList> ReadAllECUsInParallellAsync(bool minimalEcuIdReading, CancellationToken cancellationToken = default)
{
HardwareList hardwareList = null;
await Task.Run(() =>
{
//this line takes 5 minutes
_product.ReadAllHardwaresInParallell(out hardwareList, minimalEcuIdReading);
}, cancellationToken);
return hardwareList;
}
ReadAllHardwaresInParallel 方法不是异步方法,因此它不提供 CancellationToken 参数。这意味着当我取消令牌时,它将等到读取硬件完成。有什么办法可以终止吗?我知道由于资源的原因,终止线程可能是一个不好的方法,但根据业务逻辑,我需要取消它。
在 C# 中,一旦启动就无法直接停止
Task.Run
块。但是,您可以取消任务内运行的操作。以下是如何使用 CancellationToken
和 Task.Run
的组合来实现这一目标:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
// Start the task
Task task = Task.Run(() => MySyncMethod(token), token);
// Wait for user input to cancel the task
Console.WriteLine("Press any key to cancel the task...");
Console.ReadKey();
// Cancel the task
cts.Cancel();
try
{
// Await the completion of the task
await task;
}
catch (OperationCanceledException)
{
Console.WriteLine("Task was cancelled.");
}
}
static void MySyncMethod(CancellationToken token)
{
// Check if cancellation is requested
token.ThrowIfCancellationRequested();
// Your synchronous code here
}
}
在此示例中:
CancellationTokenSource
来生成取消令牌。Task.Run
。cts.Cancel()
来发出取消信号。MySyncMethod
) 中,我们定期检查是否使用 token.ThrowIfCancellationRequested()
请求取消。如果请求取消,将会抛出 OperationCanceledException
。OperationCanceledException
并妥善处理。