Re[8]: Объясните поведение ContinueWith(..., TaskContinuatio
От: AK107  
Дата: 03.01.17 09:28
Оценка:
Здравствуйте, 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 по завершении приложения
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.