我有一个单例类和一个从另一个类(类b)设置的属性,没问题。我想要一个不同的类(类a)无限期地等待,直到singleton类中的属性转换为true。我希望以最有效的方式做到这一点,所以我觉得任务是理想的,但我不能有效地将所有部分组合在一起。我不想继续轮询并睡眠thread.sleep。
public class A
{
public static void Main(string[] args)
{
if(!Monitor.Instance.HasChanged)
{
//await until the task in the Monitor class is complete
}
}
}
public class Monitor
{
private static Monitor instance;
private bool _hasChanged;
private Monitor() { }
public static Monitor Instance
{
get
{
if (instance == null)
{
instance = new Monitor();
}
return instance;
}
}
public bool HasChanged
{
get
{
return _hasChanged;
}
set
{
_hasChanged = value;
if (_hasChanged)
{
//kick off a task
}
}
}
}
public class B
{
private static readonly Monitor _instance;
public void DoSomething()
{
Monitor.Instance.HasChanged = true;
}
}
答案 0 :(得分:3)
我会为此使用TaskCompletionSource
。你可以这样做:
public class Monitor
{
private TaskCompletionSource<bool> _changedTaskSource = new TaskCompletionSource<bool>();
public Task HasChangedTask => _changedTaskSource.Task;
public bool HasChanged
...
set
{
...
_changedTaskSource.TrySetResult(true);
}
}
这将设置任务完成源,并在值更改时完成任务。你会这样等待:
await Monitor.Instance.HasChangedTask;
您的问题中有一点不明确,您需要解决的问题是重置任务。为此,只需重新创建TaskCompletionSource
。