我在接口上为负责内部创建资源的对象公开了一个WaitHandle
,但这可能需要很长时间。合同如下所示:
public interface IHaveExpensiveResources {
WaitHandle FinishedInitialization { get; }
}
WaitHandle
开始未设置,但是一旦初始化完成(在构造函数返回后,在后台),我便对其进行设置。我对此不喜欢的事情是,该合同的消费者可以在没有业务能力时自行设置WaitHandle
。它使我想起了仅获取IList<T>
属性和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;
}
然后,您只需在要返回的任何
.WaitOneAsync()
上调用FinishedInitialization
,然后返回该Task
。关于c# - 只读WaitHandle C#,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37490044/