Код: Выделить всё
// This is in a controller somewhere (i.e. so the Request object is in scope)
Task.Run(() => {
Parallel.ForEach(things, t => {
Task.Run(() => {
Parallel.ForEach(otherThings, t => {
// etc..
Я много читал и понял, что ExecutionContext должен «перетекать» во весь этот код (если вы явно не запретите это).
Первый Task.Run должен получить тот же ExecutionContext, что и «внешний» код. Он должен передать это первому Parallel.ForEach и так далее. Насколько я понимаю, код в самом низу этого стека должен иметь доступ к тем же данным, что и исходный вызывающий код.
В моей ситуации я получаю странные нулевые ошибки на некоторых уровнях, когда ясно, что блок не получил переданный ему ExecutionContext. Например, внутри Task.Run все имеет значение null, но вне его не имеет значения null. Ошибки соответствуют определенному коду, но я не вижу, чем этот код отличается от другого кода, в котором ошибка не возникает.
Я неправильно понимаю некоторые нюансы ExecutionContext поток?
Обновление: Вот какой-то глупый, надуманный код:
Код: Выделить всё
void Main()
{
var things = new string[] { "foo", "bar", "baz" };
Console.WriteLine(1);
Task.Run(() =>
{
Console.WriteLine(2);
Parallel.ForEach(things, t =>
{
Console.WriteLine(3);
Task.Run(() =>
{
Console.WriteLine(4);
Parallel.ForEach(things, t =>
{
Console.WriteLine(5);
Console.WriteLine(t);
});
});
});
});
}
Что может привести к тому, что этого не произойдет?
Подробнее здесь: https://stackoverflow.com/questions/792 ... el-foreach
Мобильная версия