2015-08-30 116 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