2015-08-30 58 views
0

你好,我正在尝试创建一个日志系统发送日志到WCF。原则上它有一个Log(字符串文本)方法,可以在实际的日志记录操作之前调用多次以减少网络喋喋不休。为了达到这个目的,我创建了一个队列(一个列表)的日志和一个定时器,它以设定的频率执行实际的日志记录。异步队列返回信息

当我想在程序中记录某些东西时,我使用Log方法。它看起来有点像这样:

private readonly List<string> _currentLogQueue = new List<string>(); 

    public void Log(string logText) 
    { 
     lock (_currentLogQueue) 
     { 
      _currentLogQueue.Add(logText); 
     } 
    } 

然后队列被定期发送到WCF。周期性的发送可以这样判定:

private void SetUpQueue(TimeSpan queueFlushPeriod) 
    { 
     Task.Run(async() => 
     { 
      while (true) 
      { 
       SendQueue(); // Does the actual communication and clears queue on success. 
       await Task.Delay(queueFlushPeriod); 
      } 
     }); 
    } 

我怎样才能使SendQueue()期间使用本记录器错误反应的程序?如果需要,我可以修改SendQueue以返回某种错误。现在我只能想到一个以代表形式传递给Log()方法的回调函数,但在异步等待的时代,它似乎非常无用而且没有乐趣。

回答

1

要回答你的问题:

可以有记录的消息的TaskCompletionSource指示成功/失败:

private readonly List<Tuple<string, TaskCompletionSource<object>> _currentLogQueue = ...; 

public Task LogAsync(string logText) 
{ 
    var tcs = new TaskCompletionSource<object>(); 
    lock (_currentLogQueue) 
    { 
     _currentLogQueue.Add(Tuple.Create(logText, tcs)); 
    } 
    return tcs.Task; 
} 

// (Within SendQueue) 
var message = queueElement.Item1; 
var tcs = queueElement.Item2; 
try 
{ 
    SendMessage(message); 
    tcs.TrySetResult(null); 
} 
catch (Exception ex) 
{ 
    tcs.TrySetException(ex); 
} 

不过,我不认为这真的会是有益的。如果记录失败,程序可以采取哪些有意义的行动?

+0

它实际上是一个通信记录器。许多“类型”的类正在被一次执行,并且如果某个类型的日志记录失败(为此日志记录是必需的),则此类型必须停止执行。 – user1713059