我使用NLOG 4.3.5和.NET Framework 4.6.1NLOG MappedDiagnosticsLogicalContext不能在異步工作/等待與ConfigureAwait(假)
當我開始一個服務器端的操作我打電話:
NLog.MappedDiagnosticsLogicalContext.Set("OperationId", Guid.NewGuid());
這通過映射並出現在我的日誌文件中。一切都很好....或者是嗎? 在審查我的日誌文件時,我注意到這個操作ID值似乎沒有按照我預期的那樣工作。
實施例:
在螺紋19的操作開始,並設置背景。
它在所有等待調用
它執行
var tasks = items.Select(item => Task.Run(() => { /* do stuff */} await Task.WhenAll(tasks).ConfigureAwait(false)
- 一個用於這些任務的線程是線程31使用.ConfigureAwait(假)(記住這一點後面再說)
- 同時,在線程36中,調用不同的服務器方法並開始新的操作。幾個日誌消息寫入它的唯一操作ID
- 此操作使用ConfigureAwait執行2個不同的等待調用(假)
- 接下來的日誌語句發生在線程31上。從此,它記錄創建的操作ID線程19開始的操作!
我沒想到會發生這種情況,我不確定它是如何發生的。但是,當我瀏覽我的日誌歷史時,我發現以前發生過這種事情。
我認爲邏輯調用上下文應該結轉。是我使用ConfigureAwait(false)導致這種行爲?這是我能想到的唯一的事情......
是,該解決方案是我上面貼的鏈接。 – Keith
這部分來自鏈接。我已更新並擴展您的要求。 – Julian