gpt4 book ai didi

c# - 只读 WaitHandle C#

转载 作者:行者123 更新时间:2023-11-30 19:55:27 26 4
gpt4 key购买 nike

我正在公开一个 WaitHandle在负责在内部创建资源的对象的接口(interface)上,但这可能需要很长时间。契约(Contract)看起来像这样:

public interface IHaveExpensiveResources {
WaitHandle FinishedInitialization { get; }
}

WaitHandle开始未设置,但一旦初始化完成(在后台,构造函数返回后),我就设置它。我不喜欢的是这个合约的消费者可以设置 WaitHandle他们自己,当他们没有业务能够做到这一点时。这让我想起了 get-only IList<T> 之间的区别属性(property)和 IReadOnlyList<T> .

C# 中是否有类似 WaitOnlyWaitHandle 的东西?它只暴露了 WaitOne()重载方法?

所以我不是 XY 问题的受害者,是否有更规范的异步构造具有较长构造时间的对象的方法?

最佳答案

您是否必须传回一个WaitHandle,或者您是否可以创建自己的包装类,它只公开您想要的函数,类似于 ReadOnlyCollection 所做的?

一个选项是将 WaitHandle 包装到一个任务中(代码示例取自 the MSDN)

public static Task WaitOneAsync(this WaitHandle waitHandle)
{
if (waitHandle == null)
throw new ArgumentNullException("waitHandle");

var tcs = new TaskCompletionSource<bool>();
var rwh = ThreadPool.RegisterWaitForSingleObject(waitHandle,
delegate { tcs.TrySetResult(true); }, null, -1, true);
var t = tcs.Task;
t.ContinueWith( (antecedent) => rwh.Unregister(null));
return t;
}

然后您只需在 FinishedInitialization 返回的任何内容上调用 .WaitOneAsync() 并返回那个 Task

关于c# - 只读 WaitHandle C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37490044/

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