2016-07-14 2 views
0

Im начнет узнавать о TPL и теперь у вас есть вопрос. У меня есть рабочий класс, который запускает Task внутри конструктора. Я синхронизирую эту задачу с событием ручного сброса. Но я хочу получить некоторую статистику об этом. Поэтому я попытался заполнить объект внутри этой задачи. Это хорошая идея?Заполнение объекта внутри Задача

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); 
    } 

ответ

1

До тех пор, пока у вас есть только одна задача, кто доступ к этой конкретной StatisticItem, вы должны быть хорошо. Это работает, потому что операторы lamba могут использовать переменные из контекста, в котором они созданы.

1

Да, вы можете это сделать, но если поле StatisticItem - это поле, вы можете активировать только одну задачу. Также целесообразно заблокировать StatisticItem

+0

StatisticItem - это собственность с частным набором. Так что это нужно для блокировки или нет? – TjDillashaw

+1

Экземпляр статистики не является проблемой. Это о свойствах Статистического объекта, который вы собираетесь читать и писать. Вы должны использовать для блокировки любого объекта, поскольку один и тот же экземпляр объекта используется с обеих сторон (gui/task). В этом случае использование объекта statisticsitem является разумным предложением, но это может быть любой объект. –

Смежные вопросы