首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取消任务并将状态设置为“已取消”

取消任务并将状态设置为“已取消”
EN

Stack Overflow用户
提问于 2017-05-11 10:25:58
回答 1查看 1.1K关注 0票数 1

我想在50毫秒结束后完成一项任务。然后,任务的状态应该设置为“取消的"RunToCompletion".”,否则设置为“RunToCompletion”.。

任务创建如下:

代码语言:javascript
复制
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以某种方式捕捉到。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-11 12:26:37

下面是与您类似的问题:在没有C#的情况下可以取消CancellationToken任务吗?。但是解决方案不会取消NotifyDevice方法中的任务。只有当基础任务支持取消时,才能取消该任务。基于这些文档,I​异步​信息可以被取消。我将使用包装器确保任务在50 is内被取消,以防取消底层任务需要更多时间:

代码语言:javascript
复制
CancellationTokenSource cts = new CancellationTokenSource(50);
await NotifyDevice(BLEDevice, cts.Token).WithCancellation(cts.Token);

编辑:扩展方法本身:

代码语言:javascript
复制
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; 
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43912798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档