Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Передать с формы данные в поток?

#c_sharp #winforms


Есть поток, работает все нормально. Но надо с формы передать данные в поток

string url = Dispatcher.BeginInvoke(new ThreadStart(delegate { textBox.Text; }));


Была идея такая, но не помогло, видимо работает в обратную сторону из потока на форму.

Подскажите как передать данные, в поток с формы.
    


Ответы

Ответ 1



Смотрите. Вы должны сначала прочитать данные, которые есть в контролах, в UI-потоке. А затем отправить их в другой поток. Сейчас для выполнения кода в отдельном потоке такого принято использовать Task. Таким образом, ваш код будет выглядеть так: // UI-поток string text = textbox.Text; Task.Run(() => ProcessText(text)); // метод ProcessText будет выполнен в пуле потоков А что делать, если поток уже есть, и в него нужно доставить сообщение? В любом случае для этого в потоке должен бежать какой-то цикл сообщений. В WinForms удобного цикла сообщений нет, но можно одолжить у WPF. Для этого подключите сборку WindowsBase, и заведите диспетчер. using System.Windows.Threading; // ... Dispatcher dispatcher = null; // запускаем поток var t = new Thread(ThreadProc); t.SetApartmentState(ApartmentState.STA); t.Start(); void ThreadProc() { Debug.WriteLine("bg thread started"); dispatcher = Dispatcher.CurrentDispatcher; Dispatcher.Run(); Debug.WriteLine("bg thread finished"); } Теперь в этот поток можно доставлять сообщения: string text = textBox.Text; dispatcher.BeginInvoke((Action)(() => ProcessInThread(text))); Когда поток больше не нужен, его можно закрыть: dispatcher.BeginInvokeShutdown(DispatcherPriority.Background); Окей, доступ к переменной dispatcher надо бы по-хорошему синхронизировать. Не делаю этого, чтобы не утяжелять код.

Комментариев нет:

Отправить комментарий