gpt4 book ai didi

c# - 检测到 ThreadPool WorkItem 已完成/等待完成

转载 作者:太空狗 更新时间:2023-10-30 00:29:24 24 4
gpt4 key购买 nike

无论出于何种原因,ThreadPoolQueueWorkItem 不会返回 IAsyncResult 或工作项的其他一些句柄,这将允许等到它完成。有 RegisterWait... 方法,但您必须传递一个 WaitHandle 并且创建它们很昂贵(请参阅 IAsyncResult 文档,它建议您延迟创建 WaitHandle 直到被请求)。 Task Parallel Library 将解决这个问题,但要等待很长时间才能可用。那么,这样的设计有没有什么问题呢:

public class Concurrent<T> {
private ManualResetEvent _resetEvent;
private T _result;

public Concurrent(Func<T> f) {
ThreadPool.QueueUserWorkItem(_ => {
_result = f();
if (_resetEvent != null)
_resetEvent.Set();
});
}

public WaitHandle WaitHandle {
get {
if (_resetEvent == null)
_resetEvent = new ManualResetEvent(_result != null);
return _resetEvent;
}

...

编辑:我问了一个follow-up question about the concerns which arise when using async delegates instead of the ThreadPool .

最佳答案

好吧,您在获取 WaitHandle 和设置它之间遇到了竞争条件。如果来电者碰巧迟到了一点点,您真的希望来电者永远等待吗?

您可能应该做一些适当的锁定并保留一个“我已经完成”标志,这样如果您确实在它完成后创建了 WaitHandle,您可以在返回它之前设置它。

我也会亲自编写静态工厂方法,而不是仅仅使用公共(public)构造函数 - 或者使其成为“创建并然后显式启动”模式。在构造函数中对工作项进行排队对我来说很奇怪。

关于c# - 检测到 ThreadPool WorkItem 已完成/等待完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/405600/

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