等待来自不同班级的任务

时间:2017-01-19 22:51:35

标签: c# multithreading async-await

我有一个单例类和一个从另一个类(类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;
    }
}

1 个答案:

答案 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