我想在50毫秒结束后完成一项任务。然后,任务的状态应该设置为“取消的"RunToCompletion".”,否则设置为“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,它没有被try/catch-block以某种方式捕捉到。
发布于 2017-05-11 12:26:37
下面是与您类似的问题:在没有C#的情况下可以取消CancellationToken任务吗?。但是解决方案不会取消NotifyDevice方法中的任务。只有当基础任务支持取消时,才能取消该任务。基于这些文档,I异步信息可以被取消。我将使用包装器确保任务在50 is内被取消,以防取消底层任务需要更多时间:
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;
}https://stackoverflow.com/questions/43912798
复制相似问题