欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# 多线程更新界面的错误的解决方法

程序员文章站 2022-06-17 22:59:43
目录由于一个线程的程序,如果调用一个功能是阻塞的,那么就会影响到界面的更新,导致使用人员操作不便。所以往往会引入双线程的工作的方式,主线程负责更新界面和调度,而次线程负责做一些阻塞的工作。这样做了之后...

由于一个线程的程序,如果调用一个功能是阻塞的,那么就会影响到界面的更新,导致使用人员操作不便。所以往往会引入双线程的工作的方式,主线程负责更新界面和调度,而次线程负责做一些阻塞的工作。

这样做了之后,又会导致一个常见的问题,就是很多开发人员会在次线程里去更新界面的内容。比如下面的例子:

C# 多线程更新界面的错误的解决方法

在上面的例子里,创建win forms应用,然后增加下面的代码:

using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.threading.tasks;
using system.windows.forms;

namespace windowsformsapp1
{
    public partial class form1 : form
    {
        public form1()
        {
            initializecomponent();
        }

        private void button1_click(object sender, eventargs e)
        {
            var thread2 = new system.threading.thread(writetextunsafe);
            thread2.start();
        }

        private void writetextunsafe() =>
            textbox1.text = "this text was set unsafely.";
    }
}

这里就是使用线程来直接更新界面的内容,就会导致下面的出错:

C# 多线程更新界面的错误的解决方法

这样在调试的界面就会弹出异常,但是有一些开发人员不是去解决这个问题,而是去关闭开发工具的选项,不让弹出这个界面。或者不使用调试方式。

其实上面的代码是有问题的,我们需要把它们修改为下面这种形式:

using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.threading.tasks;
using system.windows.forms;

namespace windowsformsapp1
{
    public partial class form1 : form
    {
        public form1()
        {
            initializecomponent();
        }

        private void button1_click(object sender, eventargs e)
        {
            var threadparameters = new system.threading.threadstart(
                delegate { writetextsafe("this text was set safely."); });
            var thread2 = new system.threading.thread(threadparameters);
            thread2.start();
        }

        public void writetextsafe(string text)
        {
            if (textbox1.invokerequired)
            {
                // call this same method but append thread2 to the text
                action safewrite = delegate { writetextsafe($"{text} (thread2)"); };
                textbox1.invoke(safewrite);
            }
            else
                textbox1.text = text;
        }
    }
}

这样问题,就得了解决。这里使用了委托的方式。

到此这篇关于c# 多线程更新界面的错误方法详情的文章就介绍到这了,更多相关c# 多线程更新界面的错误方法内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!