C# 取消任务并将状态设置为";“已取消”;
我希望在50毫秒结束后完成一项任务。然后,任务的状态应设置为“已取消”,否则设置为“运行完成”” 任务创建过程如下所示:C# 取消任务并将状态设置为";“已取消”;,c#,task,cancellationtokensource,aggregateexception,C#,Task,Cancellationtokensource,Aggregateexception,我希望在50毫秒结束后完成一项任务。然后,任务的状态应设置为“已取消”,否则设置为“运行完成”” 任务创建过程如下所示: CancellationTokenSource cts = new CancellationTokenSource(50); CancellationToken ct = cts.Token; Task test_task = Task.Run(async () => { try { tokenS.Token.Register(() =&
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);
到目前为止,我得到的只是一个
聚合异常
,它不会被try/catch
-块以某种方式捕获。这里有一个与您类似的问题:。但解决方案不会取消NotifyDevice
方法中的任务。只有在基础任务支持取消时,才能取消该任务。并且根据单据可以取消。我会使用包装器确保在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;
}
取消的公共静态异步任务(此任务任务,取消令牌取消令牌)
{
var tcs=new TaskCompletionSource();
使用(cancellationToken.Register(s=>((TaskCompletionSource)s.TrySetResult(true),tcs))
if(task!=等待task.wheny(task,tcs.task))
抛出新操作CanceledException(cancellationToken);
返回等待任务;
}
您希望在50毫秒后取消任务,还是希望在50毫秒后取消操作?任务“测试任务”。你说的手术是什么意思?wait NotifyDevice(bleedevice)
?据我所知NotifyDevice
可以持续50毫秒以上。当测试任务
在50毫秒后取消时(简易解决方案),是否希望它继续运行?好的,问题是这样的。实际上,我希望取消NotifyDevice
-方法。但到目前为止,我还没有找到解决这个问题的方法。我使用的方法是WriteClientCharacteristicConfigurationDescriptorAsync
的包装器。我把这个放在另一个帖子上,但似乎没有人能帮我。我已经发布了一个答案,这将确保包装任务将在50毫秒内取消。我还可以在你的另一个问题中添加评论。应该可以取消IAsyncOperation
。非常抱歉,我无法使用此扩展方法。编译器就是认不出这个方法?!是的,您应该在项目的某个地方实施它。我会更新我的答案,让它包括在内。听起来很奇怪。尝试将该方法放在同一个类中,并直接调用:wait with cancellation(NotifyDevice(BLEDevice,cts.Token),cts.Token)