Здравствуйте, StatujaLeha, Вы писали:
AK>>AK>> private readonly ConcurrentDictionary<AsyncLogEventInfo, Task> pendingEvents = new ConcurrentDictionary<AsyncLogEventInfo, Task>();
AK>> protected sealed override void Write(AsyncLogEventInfo info)
AK>> {
AK>> var task = WriteAsync(info);
SL> //А может быть, что мы здесь переключимся и вызовем FlushAsync?
SL> //Мне кажется или что-то плохое может произойти?
AK>> pendingEvents.TryAdd(info, task);
AK>> task.ContinueWith(x =>
AK>> {
AK>> Task tmp;
AK>> pendingEvents.TryRemove(info,
out tmp);
AK>> },
AK>> TaskContinuationOptions.ExecuteSynchronously);
AK>> }
AK>>
нет, все ок, с таким же успехом FlushAsync может быть вызван и здесь:
private async Task WriteAsync(AsyncLogEventInfo info)
{
try
{
var result = await /* или даже здесь вызывается FlushAsync */ Client.PostAsync(...);
// <- вызывается FlushAsync
result.EnsureSuccessStatusCode();
info.Continuation(null);
}
catch (Exception ex)
{
info.Continuation(ex);
}
}
да и вообще где угодно внутри .net реализации любой async функции.
от этого задача не потеряется + в самом NLog предусмотрен двойной вызов FlushAsync по завершении приложения