2016-07-14 10 views
0

Ich fange an, über TPL zu lernen und habe jetzt eine Frage. Ich habe Klasse Worker, die Task im Konstruktor starten. Ich synchronisiere diese Aufgabe mit einem manuellen Reset-Ereignis. Aber ich möchte Statistiken darüber bekommen. Also habe ich versucht, ein Objekt innerhalb dieser Aufgabe zu füllen. Ist das eine gute Idee?Füllobjekt im Inneren Aufgabe

public Worker(...) 
    { 
     ... 
     StatisticItem = new StatisticItem(); 
     .... 

     Task = Task.Factory.StartNew(() => 
     { 
      //Manual reset event 
      WaitForSignalToStart.WaitOne(); 
      while (source.IsMyTurn(RepeatOrder)) 
      { 
       Item item; 
       var realTimeWatch = new Stopwatch(); 
       while (TryGetNext(out item)) 
       { 
        ... 
        DoWork() 
        StatisticItem.PlanItemId =... 
        StatisticItem.CommandAndQueryName =... 
        StatisticItem.WokrerId = ... 
        StatisticItem.ThreadId = ... 
        StatisticItem.Date = ... 

       } 
     }, tokenSource.Token, TaskCreationOptions.LongRunning, TaskScheduler.Current); 
    } 

Antwort

1

Solange Sie nur eine Aufgabe haben, die diese spezifische StatisticItem zugreifen wollen, sollten Sie sich gut. Dies funktioniert, weil Lamba-Anweisungen Variablen aus dem Kontext verwenden können, in dem sie erstellt wurden.

1

Ja, Sie können dies tun, aber wenn StatisticItem ein Feld ist, können Sie nur eine Aufgabe aktiv haben. Es ist auch ratsam, die StatisticItem

+0

zu sperren. StatisticItem ist eine Eigenschaft mit privaten Satz. Also muss es gesperrt oder nicht? – TjDillashaw

+1

Die Instanz des statisticsitem ist nicht das Problem. Es handelt sich um die Eigenschaften des StatisticsItem, das Sie lesen und schreiben möchten. Sie müssen jedes Objekt sperren, solange die gleiche Objektinstanz auf beiden Seiten verwendet wird (gui/task). In diesem Fall ist die Verwendung des statisticsitem -Objekts ein vernünftiger Vorschlag, aber es könnte ein beliebiges Objekt sein. –

Verwandte Themen