Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 取消任务并将状态设置为";“已取消”;_C#_Task_Cancellationtokensource_Aggregateexception - Fatal编程技术网

C# 取消任务并将状态设置为";“已取消”;

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(() =&

我希望在50毫秒结束后完成一项任务。然后,任务的状态应设置为“已取消”,否则设置为“运行完成”

任务创建过程如下所示:

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)