J'ai cette logique assez simple:Portée et méthodes anonymes
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();
}
}
}
Si vous placez des points d'arrêt sur les deux Debug.WriteLine()
déclarations, vous remarquerez que quand il se casse le premier, les deux y
et ts
sont répertoriés comme locaux par le débogueur. Mais quand il frappe le point d'arrêt dans ce dernier, ts
ne figure pas en tant que local et en outre, en ajoutant ts
à la fenêtre de la montre donne The name 'ts' does not exist in the current context.
Est-ce capture variable dans l'action ou est-ce un autre mécanisme? J'ai regardé autour de writeups sur la capture de variables et je ne trouve rien qui indique explicitement que les variables ne sont capturées que lorsqu'elles sont utilisées, mais je fais l'hypothèse que cela s'appelle la capture de variables parce qu'elle ne "capture" que il a besoin et ne garde pas de références à tout ce qui est disponible.
Je pense que le code tel qu'il est écrit risque d'appeler 'Complete' avant que les actions éventuellement parallèles soient terminées. – Kit
@Kit, De la docs pour Parallel.Invoke: 'Cette méthode ne retourne pas jusqu'à ce que chacune des opérations fournies est terminée, indépendamment de savoir si l'achèvement se produit en raison de terminaison normale ou exceptionnelle.» – Pete
Oh duh. J'ai oublié ça. Merci pour le rappel. – Kit