Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
ErrorContext.CreateNewErrorContext();
Task[] tasks = Enumerable.Range(1, 10).Select(i => Task.Factory.StartNew(() =>
{
// do something
ErrorContext.Current.AttachMessage("message");
// do another thing
})).ToArray();
await Task.WhenAll(tasks);
ErrorContext.CreateNewErrorContext();
await Task.Factory.StartNew(() =>
{
// do something
ErrorContext.Current.AttachMessage("message");
// do another thing
});
await Task.Factory.StartNew(() =>
{
// do something
ErrorContext.Current.AttachMessage("message");
// do another thing
});
// waiting for other tasks
static AsyncLocal<long> asyncCounter = new AsyncLocal<long>();
static void Main(string[] args)
{
Task[] tasks = Enumerable.Range(1, 10).Select(i => Task.Factory.StartNew(() =>
{
asyncCounter.Value++;
})).ToArray();
Task.WhenAll(tasks).GetAwaiter().GetResult();
Console.WriteLine(asyncCounter.Value);
}
public class CounterContext
{
public long AsyncCounter;
}
static AsyncLocal<CounterContext> CounterContext = new AsyncLocal<CounterContext>();
static void Main(string[] args)
{
CounterContext.Value = new CounterContext();
Task[] tasks = Enumerable.Range(1, 1000).Select(i => Task.Factory.StartNew(() =>
{
CounterContext.Value.AsyncCounter++;
})).ToArray();
Task.WhenAll(tasks).GetAwaiter().GetResult();
Console.WriteLine(CounterContext.Value.AsyncCounter);
}
Используя [ThreadStatic] переменную для контекста, я получал полную кашу (в начале метода её инициализирую, а на после чтений из БД получаю значение от другого запроса).
Indicates that the value of a static field is unique for each thread.
Специально для хранения пользовательских переменных и получения к ним доступа в static-контекстах есть словарик HttpContext.Current, чтобы не изобретать велосипеды.
ExecutionContext же не связан с конкретным потоком, а логически завязан на поток исполнения.Но знает ли этот класс о переключении native threads в IIS? Некоторые авторы имеют опыт, что нет.
вы же не будете тянуть System.WebНе напрямую, а через сборку-библиотеку, где расположен код логирования. Что поделать, другого надёжного решения нет.
или консольное приложение?Не под IIS
HttpContext.Current имеет значение null, поэтому нужен fall-back на другой механизм (тот же ThreadStatic, у если нас нет async)
Сбор контекстной информации для логирования