C# .NET 中具有多个侦听器的线程一次性变量赋值

Threaded one-time variable assignment with multiple listeners in C# .NET

我有一个类型为 Variable 的 class,其中包含一个类型为 Value 的字段,该字段最初未设置 (null),但会在某个时候设置在将来。多个线程可以访问一个 Variable 对象。具有签名 Variable.Set(Value v) 的方法只被调用一次并设置变量。许多其他线程应该能够调用 Variable.Wait() (在设置 Variable 之前和之后) 其中:

当我查看 API 时,我确信周围有一些明显的同步原语——监视器、事件、等待句柄或类似的东西——但我需要帮助找出最简单、最有效的解决方案因为我正在学习 .NET 中的并行性。

使用 Lazy 类型允许通过一些长时间的 运行 工作来计算某些特定值,并让任意数量的线程等待该值,或者使用已经计算出的值。

感谢 Servy 的回答,我最终在 Variable class 中使用了私有 TaskCompletionSource<Value>。此外,我在整个应用程序中对任务应用了 async-await 模式,因此我有一个 Task<Value> Value() 字段而不是 Wait() 方法,如下所示:

class Variable
{
    private TaskCompletionSource<Value> source;
    public Task<Value> Value
    {
        get;
        private set;
    }

    public Variable() // Constructor
    {
        taskSource = new TaskCompletionSource<Value>();
        Value = taskSource.Task;
    }

    public void Set(Value val) // Called exactly once
    {
        source.SetResult(val); // Triggers task completion
    }
}