Многопоточность InvalidOperationException C#

#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 инструкции, чтобы они были правильно расположены.