2017-01-19 3 views
-2
using System; 

public class Program 
{ 
    public static void Main() 
    { 
     IRunnable runnable = new Runnable(); 
     for(int i=0;i<10;i++) 
     { 
      RunIt(runnable); 
     } 

    } 

    public static void RunIt(IRunnable runnable) 
    { 
     var context = new Context(); 
     context.Id = runnable.RunAsync((id,result)=>{ 
      //context.Id will always match "id" here? 
      context.Result = result; // can I assume here that this is the same context? 
     }); 
    } 


    public interface IRunnable 
    { 
     int RunAsync(Action<string,string> successHandler); 
    } 

    public class Runnable : IRunnable 
    { 
     private Random _random = new Random(); 

     public string RunAsync(Action<string,string> successHandler) 
     { 

      var guid = Guid.NewGuid().ToString(); 
      Task.Run(()=> 
      { 
       Thread.Sleep(_random.Next(0,1000)); 
       successHandler(guid, "result") 
      }); 
      return guid; 
     } 
    } 

     public class Context 
    { 
     public string Id {get;set;} 
     public string Result{get;set;} 
    } 


} 

In diesem Beispiel führe ich die Funktion RunIt in einer Schleife aus. RunIt startet einen Prozess asynchron und weist einen anonymen Handler zu, wenn er fertig ist. In derselben Funktion haben wir eine Kontextvariable, die von anonymem Lambda erfasst wird. Meine Frage ist einfach - kann ich davon ausgehen, dass der erfasste Kontext immer zum Ergebnis passt? Meine Sorge hier ist, dass ich es 10 Mal laufen lasse, was bedeutet, dass der Erfolg 10 Mal ungeordnet aufgerufen wird. Gibt es für jeden Kontext eine separate Version der anonymen Funktion?Schließen und Erfassen der lokalen Variablen in einer Schleife

Lange Geschichte kurz - wird context.Id immer successHandler "ID" in anonymer Funktion übereinstimmen?

+0

Nein, natürlich würde es nicht. Warum würdest du das erwarten? Sie geben CLEARY eine neue Guid zurück, die nichts mit dem Parameter successHandler zu tun hat. Warum sollten Sie erwarten, dass es zusammenpasst? –

+0

@DavidL es passt, weil ich diese GUID zurückgeben und es dem Kontext zuweisen und asynchron später successHandler mit der gleichen GUID aufrufen. – MistyK

+0

Nichts davon ist in Ihrer Frage offensichtlich. Das ist alles fehlende Kontext. Diese Frage ist nicht zu beantworten wie sie ist. –

Antwort

0

Ich weiß, dass diese Frage abgelehnt wurde, aber ich werde es trotzdem beantworten. Die Antwort ist ja, Context Variable wird separat für jede Iteration erfasst.

Verwandte Themen