C#中子线程修改主线程中textBox的内容

在编写小软件的过程中,用到了线程操作。但是其中有一个问题是,创建的子线程想修改主程序的textBox的内容,原先的想法就是在子进程调用的函数中直接修改主程序的textBox属性,但是得到的结果是:程序崩溃。原因是线程间进行了不安全的调用……代码如下:

        private void downloadFile()
        {
            DownloadClass dd = new DownloadClass();
            string temp;
            temp = fs.ReadLine();
            while (temp!=null)
            {
                dd.StrUrl = temp;
                dd.StrFileName = fileSavePath + "\\" + dealPicName(temp);
                dd.DownloadFile();

                tBoxResult.AppendText(dd.strError + "\n");
                temp = fs.ReadLine();
            }
            MessageBox.Show("下载工作圆满完成!", "恭喜", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

//使用线程技术
            oThread = new Thread(new ThreadStart(this.downloadFile));
            oThread.Start();

从上面的代码中可以看到,子线程执行downloadFile函数,该函数中,修改了主程序中的tBoxResult的属性,这样调用,属于不安全调用

解决方案:

加入如下函数

//线程间安全调用windows空间
        delegate void SetTextCallback(string text);//后加的,好好想一想,参数是SetText带的参数。

        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.tBoxResult.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });
            }
            else
            {
                this.tBoxResult.AppendText(text);
                this.tBoxResult.Refresh();
            }
        }

现在在子线程中想修改主程序中的textBox的属性就易如反掌了。只需要就downloadFile函数中的

 tBoxResult.AppendText(dd.strError + "\n");

替换为

this.SetText(dd.strError + "\n");

就可以了。

你可能感兴趣的:(C#编程)