2016-11-18 83 views
1

我需要創建一個使用HttpClient的目標。 HttpClient不包含任何同步方法,它們都是Task返回異步調用。在NLog目標中使用這種方法的最佳方法是什麼?看到api似乎不是異步/等待意識?NLog目標中的HttpClient

回答

1

也許像這樣的東西應該工作:

public class CustomTarget : Target 
{ 

protected override async void Write(NLog.Common.AsyncLogEventInfo logEvent) 
{ 
    try 
    { 
      await WriteAsync(logEvent.LogEvent).ConfigureAwait(false); 
      logEvent.Continuation(null); 
    } 
    catch (Exception ex) 
    { 
      InternalLogger.Error(ex, "Failed to sent message"); 
      logEvent.Continuation(ex); 
    } 
} 

} 

或竊取從這個PR代碼:https://github.com/NLog/NLog/pull/2006

1

如果你想讓事情變得簡單,那麼你可以在異步任務上做一個Wait()。然後使用AsyncTargetWrapper包裝您的自定義目標。那麼你也不必擔心有太多的活動http請求。

但是NLog對執行延遲日誌寫入操作的目標沒有問題。唯一需要的合同是在延遲的日誌寫入操作終於完成之後調用與LogEventInfo一起提供的異步延續(也許看一下NetworkTarget尋求靈感)

+0

也許這也是存儲'Tasks'目標的選項和''FlushAsync'他們await'? – Julian

+0

@Julian有沒有計劃更新NLog以支持基於任務的異步方法? – Dismissile

+0

@Dismissile NLog ver。 4.4.6包含https://github.com/NLog/NLog/blob/master/src/NLog/Targets/AsyncTaskTarget.cs –