#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. Если все поля пусты при запуске приложения и работа выполняется при нажатии кнопки, то строке нужно присвоить значение после нажатия кнопки, а не до, я не прав? И поэтому в этом сценарии я действительно ничего не могу сделать со строкой, пока не нажму кнопку, и в этом случае я привязан к потоку, который создается нажатием кнопки.