我在接口上为负责内部创建资源的对象公开了一个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/

10-10 21:56