Как захватить переменную из потока пользовательского интерфейса, находясь в рабочем потоке?

#c# #.net #multithreading #http #dispatcher

#c# #.net #многопоточность #http #диспетчер

Вопрос:

Я медленно продвигаюсь по простому приложению, которое я создаю: оно создает запрос, заполняет заголовки и извлекает веб-страницу для меня. Я выяснил, что для обновления пользовательского интерфейса (после нажатия кнопки) я должен использовать dispatcher следующим образом:

 Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new delegate_onearg_s(UpdateStatus), "Sending Request...");
  

В этом случае у меня есть UpdateStatus (строковое сообщение), которое устанавливает мой label_Status = message;

Пока все хорошо. Теперь я хочу, чтобы она сначала принимала входные данные из текстового поля, а затем превращала их в URL, который позже используется для создания запроса, но как мне это сделать? Я пробовал это:

 string url = Convert.ToString(Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new delegate_string_get(GetInput)));
  

GetInput() в этом случае просто возвращает TextBox.Text;
На самом деле это не работает — это возвращает какую-то общую вещь, связанную с диспетчером.

Как я могу получить переменную из текстового поля в потоке пользовательского интерфейса и передать ее в рабочий поток с помощью диспетчера?

Merci beacoup 🙂

PS. Существует очень высокая вероятность того, что я не знаю, что делаю. Просто имейте это в виду при ответе.

Ответ №1:

Вы на правильном пути, но вам нужно использовать Invoke , а не BeginInvoke . BeginInvoke выполняет делегат асинхронно в потоке диспетчера, но вам нужно получить результат синхронно.

 string url = (string)Dispatcher.Invoke(new Func<string>(GetInput));
  

Ответ №2:

перед запуском потока объявите строковую переменную и присвоите ей значение из текстового поля, затем используйте эту переменную в вашем методе GetInput.

 string myVal = myTextBox.Text;
  


используйте ее в вашем GetInput.

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

1. Если все поля пусты при запуске приложения и работа выполняется при нажатии кнопки, то строке нужно присвоить значение после нажатия кнопки, а не до, я не прав? И поэтому в этом сценарии я действительно ничего не могу сделать со строкой, пока не нажму кнопку, и в этом случае я привязан к потоку, который создается нажатием кнопки.