我有一个类型为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
}
}