2017-01-19 3 views
3

У меня есть одноэлементный класс и свойство, которое устанавливается из другого класса (класс 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; 
    } 
} 

ответ

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.

+0

Спасибо, я подтвержу это завтра. Последний вопрос, так как я не эксперт. Потребитель в настоящее время не является асинхронным методом, поэтому ожидание имеет проблемы. Было бы легко сделать метод async, но, на мой вопрос, оказывает ли это какое-либо влияние на всех вызывающих абонентов, которые ранее использовали это как метод non-async? – Roka

+0

@Roka Обычно ожидается, что все вызовет цепочку вызовов. Если вы хотите синхронное ожидание, «Task.Wait» прекрасно, но имейте в виду, что вы можете блокировать вещь, которая пытается изменить вашу переменную. – BradleyDotNET

Смежные вопросы