#c# #multithreading #delegates #richtextbox
#c# #Многопоточность #делегаты #richtextbox ричтекстбокс
Вопрос:
у меня есть кнопка.когда я нажимаю эту кнопку, я создаю новый поток, затем переходит к методу ThreadProcSafe, и я хочу, чтобы там был установлен ответ в richtextbox.но когда я пытаюсь это сделать, я всегда принимаю InvalidOperationException и сообщаю мне, что операция с перекрестным потоком недопустима: управление, доступное из потока, отличного от потокаон был создан на.есть какие-нибудь предложения?
delegate void SetTextCallback(string text);
private Thread demoThread = null;
private void Go_Click(object sender,EventArgs e)
{
this.demoThread =new Thread(new ThreadStart(this.ThreadProcSafe));
this.demoThread.Start();
}
// This method send a request get response
private void ThreadProcSafe()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
richTextBox1.Text = sr.ReadToEnd();
sr.Close();
this.SetText(richTextBox1.Text);
}
private void SetText(string text)
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (this.richTextBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.richTextBox1.Text = text;
}
}
Ответ №1:
Потому что вы делаете это richTextBox1.Text = sr.ReadToEnd();
внутри вашего ThreadProcSafe
. То, что вы, вероятно, хотели сделать, это:
private void ThreadProcSafe()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
string res = sr.ReadToEnd();
sr.Close();
this.SetText(res);
}
Обратите внимание, что вы должны обернуть свои потоки в using
инструкции, чтобы они были правильно расположены.