2016-12-17 12 views
4

У меня есть одна асинхронной задача выполняется бесконечный цикл делает некоторую обработку в реальном времени:C# синхронизация между задачами async с бесконечным циклом while?

private async void RealTimeProcessingAsync() 
{ 
    while (true) 
    { 
     //.... 
     Tmstaus status = await ReadStatusAsync(); 
     switch (status) 
     { 
      case Ack: 
      //... 
      break; 
      //... 
     } 
     //... 
    } 
} 

И я создал еще один метод асинхронной SendWriteRqst этой команды пост в RealTimeProcessingAsync(), следует дождаться статуса, чтобы установить в определенное состояние и обратно.

public async Task<WriteState> SendWriteRqstAsync(TmCommand tmCmd) 
{ 
    //... 
    await SomeCondition()//based on status value 
    //... 
    return wrState; 
} 

Это будет работает, если SomeCondition() запускает другое время цикл для опроса состояния и вернуться верно, если установить условие, но я ищу лучшее решение.

(простите за плохой английский)

+0

Что такое 'SomeCondition()' делать, статус опроса откуда/что? –

+0

На самом деле это задача, которая проверяет условия некоторых переменных из RealTimeProcessingAsync() как переменную состояния. – Amordad

+0

Поэтому 'SomeCondition()' будет вызывать 'RealTimeProcessingAsync()', но будет возвращаться только в случае выполнения некоторых условий, которые зависят от изменений состояния, сделанных 'RealTimeProcessingAsync()'. Вот почему вы должны многократно вызывать 'RealTimeProcessingAsync()'. Это оно? –

ответ

4

Это будет работает, если SomeCondition() запускает другое время цикл для опроса состояния и вернуться верно, если установить условие, но я ищу лучшее решение.

Что вы хотите - это сигнал вместо цикла опроса. Если вам нужно только установить сигнал один раз, вы можете использовать TaskCompletionSource<T>. Если вам нужен сигнал, который можно установить и сбросить (без необходимости реконструировать), вы можете использовать AsyncManualResetEvent (также available from NuGet in my AsyncEx.Coordination library).

+0

«AsyncManualResetEvent» - это то, что мне нужно, спасибо за ваш ответ и библиотеку, это очень полезно для меня. – Amordad

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

  • Нет связанных вопросов^_^