1

我希望在 50 毫秒结束后完成一项任务。然后任务的状态应该设置为“ Canceled ”,否则设置为“ RunToCompletion ”。

任务创建在这里:

CancellationTokenSource cts = new CancellationTokenSource(50);
CancellationToken ct = cts.Token;
Task test_task = Task.Run(async () =>
{
    try
    {
        tokenS.Token.Register(() =>
        {
            cts.Cancel();
            ct.ThrowIfCancellationRequested();
        });
        await NotifyDevice(BLEDevice);
    }
    catch (Exception e)
    {
    }
},ct);

到目前为止,我得到的只是一个AggregateException,它不会被 -block 以某种方式try/catch捕获。

4

1 回答 1

1

这是与您类似的问题:是否可以在没有 CancellationToken 的情况下取消 C# 任务?. 但是解决方案不会取消NotifyDevice方法中的任务。只有当底层任务支持取消时,才能取消该任务。并且基于文档I​Async​Info可以被取消。如果取消底层任务需要更多时间,我会使用包装器以确保在 50 毫秒内取消任务:

CancellationTokenSource cts = new CancellationTokenSource(50);
await NotifyDevice(BLEDevice, cts.Token).WithCancellation(cts.Token);

编辑:扩展方法本身:

public static async Task<T> WithCancellation<T>(this Task<T> task, CancellationToken cancellationToken) 
{ 
    var tcs = new TaskCompletionSource<bool>(); 
    using(cancellationToken.Register(s => ((TaskCompletionSource<bool>)s).TrySetResult(true), tcs)) 
        if (task != await Task.WhenAny(task, tcs.Task)) 
            throw new OperationCanceledException(cancellationToken); 
    return await task; 
}
于 2017-05-11T12:26:37.583 回答