2017-01-02 44 views
1

我試圖使用進程間通信從我的程序的一個實例發送其內容到另一個實例。我在這裏下的代碼正在工作,但它使第一個實例凍結,並且只在第二個實例創建並且數據傳回時繼續運行。我懷疑它是因爲messaging_server0()不是異步任務。如何解決這個問題。有沒有辦法使messaging_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

您正在異步啓動消息傳遞任務,但會立即檢查其「結果」,因爲它沒有選擇,只能阻止調用線程並等待任務完成。 – 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

與阿列克科瓦爾奇克的幫助和一些挖我想出了此代碼

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

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

     } 
    } 

加上他發佈的代碼段。 這個完美的作品。謝謝

相關問題