У меня есть эта довольно простая логика:Области применения и анонимные методы
class Program
{
static void Main(string[] args)
{
using (TransactionScope ts = new TransactionScope())
{
System.Threading.Tasks.Parallel.Invoke(() =>
{
TransactionScope y = ts;
System.Diagnostics.Debug.WriteLine("Test");
},
() =>
{
System.Diagnostics.Debug.WriteLine("Test");
}
);
ts.Complete();
}
}
}
Если вы устанавливаете контрольные точки на два Debug.WriteLine()
заявления, вы заметите, что, когда он ломается на первом, так и y
ts
перечислены locals отладчиком. Но когда она попадает в точку останова в последней, ts
нет в списке, как локальный и, кроме того, добавление ts
в окне просмотра дает The name 'ts' does not exist in the current context.
Является ли эта переменная отлов в действии, или это какой-то другой механизм? Я посмотрел на записи по захвату переменной, и я не могу найти ничего, что явно указывает, что переменные захватываются только тогда, когда они используются, но я исхожу из предположения, что он называется захватом переменной, потому что он только «захватывает» то, что он нуждается и не поддерживает ссылки на все доступные.
Я думаю, что написанный код может оказаться под угрозой вызова 'Complete' до того, как возможно параллельные действия будут завершены. – Kit
@Kit, из документации для Parallel.Invoke: «Этот метод не возвращается, пока каждая из предоставленных операций не завершится, независимо от того, происходит ли завершение из-за нормального или исключительного завершения.» – Pete
О, ду. Я забыл об этом. Спасибо за напоминание. – Kit