2017-04-26 54 views
-2

我有一個在後臺運行的異步任務。該任務將消息發送到apache kafka服務器。每當網絡出現問題時,都會導致異常。但是主線程無法捕捉到這個異常。我需要將來自異步後臺任務的異常傳遞給主線程非異步方法

這是我在後臺線程任務中使用代碼 -

async SendMessageAsync() { 
await Task.WhenAll(sendTasks.ToArray()).ContinueWith(e => e.Exception); 
} 

雖然我的主線程非異步方法運行像 -

try 
{ 
Message[] messages = { new Message(msg) }; 
var res = _KafkaProducer.SendMessageAsync(topic, messages, acks, timeout, codec); 
} 
catch (Exception ex) 
{ 
Console.WriteLine("Here"); 
} 

控制從來就沒有到Console.writeLine聲明。如果我在主線程中實現task.wait(),那麼我的主線程將阻塞,直到我的後臺線程完成。有沒有其他方法可以做到這一點?我不想讓主線程異步的方法。

+1

所以你想異步等待,但不是異步。你不想等待電話結束,但你想等待電話結束捕捉異常? – Default

+0

爲什麼你需要捕獲主線程中的異常?你可能會創建一個封裝方法來捕獲和處理這個調用嗎?或者只是捕獲並處理SendMessageAsync中的異常 – Default

+0

我正在尋找一種方法,不需要我在主線程異步執行方法,並且還要等待後臺線程的執行完成。 –

回答

1

您的代碼當前正在使用「fire and forget」模式,該模式通過忽略任何異常而表現正確。如果你不想忽略異常,那麼你不應該用火和遺忘。

您的選項是(按優先順序排列):

  1. await(讓你的主要方法async)。
  2. Block。
  3. 通知。 「通知」的工作方式取決於您的主線程如何工作(何時以及如何接收信號)。

我需要冒泡到我的斷路器類。

因此,應用上述選項:

  1. await(讓你的斷路器async兼容)。
  2. Block。
  3. 通知。但是您的主線程必須在返回到斷路器代碼之前等待通知

由於「通知」方法已被減少爲「阻止」,因此它不再是真正成爲解決方案的可行方式。

這使您的唯一選項成爲異步或阻塞。我想推薦async。這可能會更容易replace your circuit breaker with Polly's, which already has async support built-in