2016-11-18 39 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 –