gpt4 book ai didi

c# - 我应该始终完成 TaskCompletionSource 吗?

转载 作者:行者123 更新时间:2023-12-01 18:58:08 26 4
gpt4 key购买 nike

TaskCompletionSource 会发生什么?及其Task如果TaskCompletionSource永远不会完成(即 SetCancelledSetExceptionSetResult 永远不会被调用? Task 会因为它永远不会完成而永远存在吗?

在下面的示例中,我有一个参数化测试的简化版本。如果发生超时(MyEevent 在 1000 毫秒内未调用),则 TaskCompletionSource ( tcs ) 永远不会完成。我有很多这样的测试。我是否需要进行任何类型的清理(例如,确保调用 tcs.SetCancelled())?

[Theory]
[InlineData("aa")]
[InlineData(2)]
[InlineData(true)]
[InlineData(null)]
public async Task RaiseMyEvent_RaisesMyEvent_WithOriginalValue(object value)
{
var sut = new Thing();
var tcs = new TaskCompletionSource<object>();
sut.MyEvent += (_, args) => tcs.SetResult(args.Value);

sut.RaiseMyEvent(value);

tcs.Task.Should().BeSameAs(await Task.WhenAny(Task.Delay(1000), tcs.Task), "MyEvent should be raised within 1000ms");
tcs.Task.Result.Should().Be(value);
}

当我们这样做时,有什么方法可以改进上述测试(例如,使其更加简洁/简单/可读)?

最佳答案

Do I need to do any sort of cleanup (e.g. make sure tcs.SetCancelled() is called)?

使用 TaskCompletionSource<T>不需要任何清理。事实上,它甚至不承认任何清理工作。所以你的问题的答案是“不”。

TaskCompletionSource<T>只是一个概念上简单的数据结构,它允许您至多推送一个事物(类型 T 的结果、异常或取消)。它的Task属性暴露了 Task<T>这只是这个 promise 的单一事情的包装,它将被插入TaskCompletionSource<T>在未来的某个时间。它不使用任何任务池。

永远不要将任何东西插入 TaskCompletionSource<T>是完全有效的。这正好对应于 Task<T>这将永远“运行”并且永远不会完成。

关于c# - 我应该始终完成 TaskCompletionSource 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27254501/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com