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



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

  • 如果Variable已设置,应立即返回。
  • 如果未设置Variable,则应(有效地)等待设置,然后返回。

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

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

多亏

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

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
    }
}

最新更新