首页 > 解决方案 > CancellationTokenSource 在 TaskCompletionSource 上未按预期工作

问题描述

我正在尝试使用 TaskCompletionSource 将基于事件的调用包装到任务上,但由于某种原因,这无法按预期工作,当调用 SendRequest 时,await SendRequest(cmdid, data)无论我如何尝试 SetCanceled、SetResult 等,它都不会返回...

为了确保任务在进一步排除故障之前结束,下面我正在尝试使用 CancellationTokenSource,它似乎没有按预期工作,我是否误解了 TaskCompletionSource 和 Cancellation 的概念和用法?

我的理解是,当附加到 tcs 的取消令牌将在 1 秒后过期时,以下代码将引发异常,但不会,await SendRequest(cmdid, data)永远阻塞。

        public async Task<object> SendRequest(CmdId cmdID, object data)
        {
            CancellationTokenSource source = new CancellationTokenSource(1000);
            TaskCompletionSource<object> tcs = new TaskCompletionSource<object>(source.Token);
            
            Request(cmdID, seqNr, data);
 
            return await tcs.Task;
        }

我在这里先向您的帮助表示感谢。

标签: c#.netasync-await

解决方案


这种用法:

TaskCompletionSource<object> tcs = new TaskCompletionSource<object>(source.Token);

只需设置AsyncState任务的。它与取消无关,并且不会自动挂钩。如果你想让取消做某事,你需要使用Register取消令牌上的方法,并实际触发 TCS 被取消。


推荐阅读