终止/停止等待Task.Run块,其中包含同步方法

问题描述 投票:0回答:1

这是我的代码:

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# async-await kill termination
1个回答
0
投票

在 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
    并妥善处理。
© www.soinside.com 2019 - 2024. All rights reserved.