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
之前和之后) 其中:
- 如果
Variable
已经设置,应该立即 return。
- 如果
Variable
没有设置,应该等待(有效地)设置它,然后 return。
当我查看 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
}
}
我有一个类型为 Variable
的 class,其中包含一个类型为 Value
的字段,该字段最初未设置 (null
),但会在某个时候设置在将来。多个线程可以访问一个 Variable
对象。具有签名 Variable.Set(Value v)
的方法只被调用一次并设置变量。许多其他线程应该能够调用 Variable.Wait()
(在设置 Variable
之前和之后) 其中:
- 如果
Variable
已经设置,应该立即 return。 - 如果
Variable
没有设置,应该等待(有效地)设置它,然后 return。
当我查看 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
}
}