2

Есть Task внутри идет цикл и при каждой итерации нужно вывести данные в TextBox. Пишу так

Task.Run(() => {
   for(int i = 0; i < 100; i++){
      txtBox.text = "Example: " + i;
   }
},TaskScheduler.FromCurrentSynchronizationContext);

пишет что был создан не из того потока. как быть? Нигде норм не могу прочесть про это. кто сталкивался помогите.

andreycha
  • 25,167
  • 4
  • 46
  • 82
borzz.one
  • 151
  • 13

1 Answers1

2

Тебе нужно использовать метод Invoke у textBox.

Invoke - Выполняет указанный делегат в том потоке, которому принадлежит базовый дескриптор окна элемента управления

Task.Run(() => {
   for(int i = 0; i < 100; i++){
      txtBox.invoke(new Action(()=>{textBox.text = "Example: " + i;}))
    }
},TaskScheduler.FromCurrentSynchronizationContext);

UPDATE

WinForm - txtBox.invoke

WPF - txtBox.Dispatcher.Invoke

  • Работает. А правильно ли так использовать это? – borzz.one Jul 03 '17 at 08:48
  • 1
    Метод Task.Run() ставит задачу в в очередь для запуска в ThreadPool. Иными словами твоя задача будет выполнена в другом потоке (можешь это проверить написав MessageBox.Show(Thread.CurrentThread.ManagedThreadId) перед Task.Run и внутри Task.Run). Другой поток просто не догадывается о существовании textbox`a, следовательно тебе нужно выполнить действие в потоке который создал textbox. – Bohdan Dorokhin Jul 03 '17 at 08:58
  • Все понял. Спасибо – borzz.one Jul 03 '17 at 09:34