2017-01-02 2 views
1

Я пытаюсь использовать связь между процессами для отправки из одного экземпляра моей программы ее содержимого в другой экземпляр. Код, который у меня есть, работает, но он заставляет замораживать первый экземпляр и продолжает работать только при создании второго инстанса и передачи данных обратно. Я подозреваю, что поскольку messaging_server0() не является асинхронной задачей. Как бы подойти к этой проблеме. Есть ли способ сделать async для обмена сообщениями_server0? или я что-то упускаю?C# упаковка задачи в другую задачу

Основной цикл содержит этот кусок кода

var makeTask = Task<string>.Factory.StartNew(() => pipe_server.messaging_server0()); 

if (makeTask.Result != null) { 
    dataGrid_logic.DataGridLoadTarget(makeTask.Result); 
} 

, а с другой стороны, я messaging_server0

public static string messaging_server0() 
{ 
    using (var messagebus1 = new TinyMessageBus("ExampleChannel")) 
    { 
     string ret = null; 

     messagebus1.MessageReceived += (sender, e) => ret = Encoding.UTF8.GetString(e.Message); 

     while (true) 
     { 
      if (ret != null) 
      { 
       return ret; 
      } 
     } 
    } 
} 

Имена методов будут переработан.

+5

Вы запускаете задачу обмена сообщениями асинхронно, но сразу проверяете ее 'Result', для которой у него нет выбора, кроме как заблокировать вызывающий поток и дождаться завершения задачи. – Abion47

ответ

1

Я хотел бы предложить следующий подход:

public static async Task<string> messaging_server0() 
    { 
     using (var messagebus1 = new TinyMessageBus("ExampleChannel")) 

     { 
      var taskCompletition = new TaskCompletionSource<string>(); 

      messagebus1.MessageReceived += 
       (sender, e) => 
       { 
        var ret = Encoding.UTF8.GetString(e.Message); 
        taskCompletition.TrySetResult(ret); 
       }; 

      return await taskCompletition.Task; 
     } 
    } 

Очевидно, что вам нужно будет добавить некоторую обработку ошибок, тайм-ауты при необходимости и т.д.

+0

Не будет ли сообщение messagebus удаляться после возвращения из этого метода. – Nkosi

+0

Я все равно получаю тот же результат, основное приложение зависает до запуска второго экземпляра. Я думаю, мне нужно отредактировать основной цикл, который вызывает метод или? http://i.imgur.com/rj8CSCm.png – BoKKeR

+0

@Nkosi хорошая точка, я отредактировал ответ, чтобы избежать утилизации 'TinyMessageBus' после того, как мы выйдем из этого метода. Очевидно, что это одно из возможных подходов, другое - держать ссылку на 'TinyMessageBus' столько, сколько необходимо. –

1

с помощью Alek Ковальчик и некоторых рытье я придумал этот код

private async void xxx() 
    { 
     var makeTask = Task<string>.Factory.StartNew(() => pipe_server.messaging_server()); 

     await pipe_server.messaging_server(); 
     { 
      dataGrid_logic.DataGridLoadTarget(makeTask.Result); 

     } 
    } 

плюс отрывок, который он опубликовал. Это прекрасно работает. спасибо

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