AsyncLocal <T>-подобная функциональность, которая копируется в ожидание, но не новые задачи - PullRequest
0 голосов
/ 04 октября 2018

Я создаю класс-оболочку для NLog.Я хотел бы захватить логический поток выполнения через записи журнала.Традиционно мы могли сделать это через идентификатор потока;однако это становится бесполезным для асинхронного кода, поскольку другой поток может продолжить выполнение после await.Поэтому я пытаюсь ввести другое поле, которое сохраняется при await вызовах.

AsyncLocal<T> соответствует этому требованию.Однако он также копируется при порождении новых задач через Task.Run, что снижает его полезность, поскольку он распределяется между параллельными потоками.Есть ли какая-то функциональность, которая сохраняет поля в await, но не Task.Run?Я не против того, что происходит при присоединении к параллельным задачам (например, await Task.WhenAll).

Я бы хотел, чтобы это было чем-то, что можно сделать централизованно через мой класс-обертку, а не копировать на все вызовы Task.Run.

var asyncLocal = new AsyncLocal<string>();
asyncLocal.Value = "Test";

await Task.Yield();
Console.Write(asyncLocal.Value ?? "null");   // should be "Test"

await Task.Run(() =>
{
    Console.WriteLine(asyncLocal.Value ?? "null");   // should be "null"
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...