精易论坛

标题: c# 多线程修改TextBox 内容 [打印本页]

作者: 赵六    时间: 2019-3-28 11:53
标题: c# 多线程修改TextBox 内容
本帖最后由 赵六 于 2019-3-28 18:07 编辑

第一种方法 不建议使用 偷懒用的
在多线程程序中,新创建的线程不能访问UI线程创建的窗口控件,如果需要访问窗口中的控件,可以在窗口构造函数中将CheckForIllegalCrossThreadCalls设置为 false
代码如下
  
public partial class Form1 : Form
{
Action SetTextValue;
public Form1 ()
{
InitializeComponent ();
CheckForIllegalCrossThreadCalls = false;
SetTextValue = Text_Update;
}

private void button1_Click (object sender, EventArgs e)
{
Thread th = new Thread (new ThreadStart (Text_Update));
th.Start ();
}
public void Text_Update ()
{
for (int i = 0; i < 100; i++)
{
textBox1.Text = i.ToString ();
Thread.Sleep (200);
}


}
private void Form1_Load (object sender, EventArgs e)
{
}
}

第二种方法 推荐
public partial class form : Form
    {
        public form()
        {
            InitializeComponent();
        }


      
        private void button1_Click(object sender, EventArgs e)
        {
            Thread th = new Thread(new ThreadStart(Por));

            th.IsBackground = true;

            th.Start();


        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }


        private void Por()
        {
         

                for (int i = 0; i < 10000000; i++)
                {
                    if (textBox1.InvokeRequired)
                    {
                        textBox1.Invoke(new Action<TextBox, string>(SetTextValue), textBox1, i.ToString());
                    }
                    else
                    {
                        textBox1.Text = i.ToString();
                    }


                }
            

        }


        private void SetTextValue(TextBox text, string msg)
        {
            text.Text = msg;
        }

        private void form_Load(object sender, EventArgs e)
        {

        }
    }


TextBox_多线程修改.zip

328.28 KB, 下载次数: 13, 下载积分: 精币 -2 枚


作者: 薆要执著    时间: 2019-3-28 13:23
都不推荐 使用上面的方法 太繁琐
  1.             BeginInvoke(new Action(()=> {
  2.                 textBox1.Text = "123";
  3.             }));
复制代码



使用 BeginInvoke 就行了
作者: 赵六    时间: 2019-3-28 14:05
薆要执著 发表于 2019-3-28 13:23
都不推荐 使用上面的方法 太繁琐

直接这样使用 会有问题的
作者: 薆要执著    时间: 2019-3-28 14:36
赵六 发表于 2019-3-28 14:05
直接这样使用 会有问题的

没有任何问题,BeginInvoke 只是把委托传递给主线程消息列 由主线程执行委托而已,里面可以直接操作界面控件
另外还有 Invoke 是同步的

作者: 赵六    时间: 2019-3-28 15:05
薆要执著 发表于 2019-3-28 14:36
没有任何问题,BeginInvoke 只是把委托传递给主线程消息列 由主线程执行委托而已,里面可以直接操作界面控 ...

上代码 我用beginvoke 看不到信息显示
作者: 薆要执著    时间: 2019-3-28 15:21
赵六 发表于 2019-3-28 15:05
上代码 我用beginvoke 看不到信息显示

  1.             new Task(() => {
  2.                 BeginInvoke(new Action(() => {
  3.                     textBox1.Text = Guid.NewGuid().ToString();
  4.                 }));
  5.             }).Start();
复制代码


作者: 赵六    时间: 2019-3-28 15:56
薆要执著 发表于 2019-3-28 15:21

这只是单线程啊 你循环里修改资料试试
作者: 薆要执著    时间: 2019-3-28 16:15
赵六 发表于 2019-3-28 15:56
这只是单线程啊 你循环里修改资料试试

不扯了  代码又莫名其妙的变单线程了  你写到你IDE里面 下断点调试看看 几个线程
作者: 遵义静以修身    时间: 2019-4-10 17:38
好厉害呀
作者: 夜鬼    时间: 2019-4-17 18:20
大佬 没看到是多线程  只看到是用委托 启动一个线程啊  
作者: 赵六    时间: 2019-4-17 20:37
夜鬼 发表于 2019-4-17 18:20
大佬 没看到是多线程  只看到是用委托 启动一个线程啊

修改内容都是UI线程 你多线程操作其它 的 不影响啊
作者: 夜鬼    时间: 2019-4-23 22:12
赵六 发表于 2019-4-17 20:37
修改内容都是UI线程 你多线程操作其它 的 不影响啊

有没有多线程的例子 不是线程池的
作者: louyi319    时间: 2020-12-2 12:21
退出后,有异常。。。
作者: 早餐哥    时间: 2021-3-23 09:55
委托,多线程
作者: WHSnail    时间: 2022-1-14 21:49
用得着这么麻烦   this.invoke(new Action(()=>{textBox1.Text="内容";}));不就行了




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4