#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 надо бы по-хорошему синхронизировать. Не делаю этого, чтобы не утяжелять код.
Комментариев нет:
Отправить комментарий