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

 更新时间:2021年10月11日 15:18:57   作者:caimouse  
这篇文章主要介绍了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.";
    }
}

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

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

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

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# 多线程更新界面的错误方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#中参数数组、引用参数和输出参数示例详解

    C#中参数数组、引用参数和输出参数示例详解

    这篇文章主要给大家介绍了关于C#中参数数组、引用参数和输出参数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05
  • unity绘制一条流动的弧线(贝塞尔线)

    unity绘制一条流动的弧线(贝塞尔线)

    这篇文章主要为大家详细介绍了unity绘制一条流动弧线的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • C#枚举类型与结构类型实例解析

    C#枚举类型与结构类型实例解析

    这篇文章主要介绍了C#枚举类型与结构类型实例,需要的朋友可以参考下
    2014-07-07
  • C# DataTable的详细用法分享

    C# DataTable的详细用法分享

    在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结
    2013-11-11
  • C#如何使用Bogus创建模拟数据示例代码

    C#如何使用Bogus创建模拟数据示例代码

    这篇文章主要给大家介绍了关于C#如何使用Bogus创建模拟数据的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • winform去掉右上角关闭按钮的方法

    winform去掉右上角关闭按钮的方法

    这篇文章主要介绍了winform去掉右上角关闭按钮的方法,需要的朋友可以参考下
    2014-02-02
  • 深入Ref,Out的理解及其使用

    深入Ref,Out的理解及其使用

    本篇文章是对Ref与Out进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • C#获取项目指定目录下文件的方法

    C#获取项目指定目录下文件的方法

    这篇文章主要介绍了C#获取项目指定目录下文件的方法,涉及C#操作目录及文件的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C#如何在窗体程序中操作数据库数据

    C#如何在窗体程序中操作数据库数据

    这篇文章主要介绍了C#如何在窗体程序中操作数据库数据,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • 深入C#中get与set的详解

    深入C#中get与set的详解

    本篇文章是对C#中的get与set进行了详细的分析介绍,需要的朋友参考下
    2013-06-06

最新评论