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# Nullable的使用小结

    C# Nullable的使用小结

    本文主要介绍了C# Nullable的使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • C# Form自定义光标的简单实现

    C# Form自定义光标的简单实现

    这篇文章主要介绍了C# Form自定义光标的简单实现,有需要的朋友可以参考一下
    2014-01-01
  • C#中实现任意List的全组合算法代码

    C#中实现任意List的全组合算法代码

    这篇文章主要是介绍了.net C# 实现任意List的全组合算法实现代码,需要的朋友可以参考下
    2013-05-05
  • C# 从Excel读取数据向SQL server写入

    C# 从Excel读取数据向SQL server写入

    这篇文章主要介绍了C# 从Excel读取数据向SQL server写入的方法,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • C#/VB.NET实现HTML转为XML的示例代码

    C#/VB.NET实现HTML转为XML的示例代码

    可扩展标记语言(XML)文件是一种标准的文本文件,它使用特定的标记来描述文档的结构以及其他特性。本文将利用C#实现HTML转为XML,需要的可以参考一下
    2022-06-06
  • 基于C#的抽象类别详解

    基于C#的抽象类别详解

    下面小编就为大家分享一篇基于C#的抽象类别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • C# TextBox数据绑定的方法

    C# TextBox数据绑定的方法

    这篇文章主要为大家详细介绍了C# TextBox数据绑定的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • C#调用Oracle存储过程方法介绍(附源码)

    C#调用Oracle存储过程方法介绍(附源码)

    这篇文章介绍了C#调用Oracle存储过程的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Unity UI实现循环播放序列图

    Unity UI实现循环播放序列图

    这篇文章主要为大家详细介绍了Unity UI实现循环播放序列图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C#中的异常处理问题try catch finally

    C#中的异常处理问题try catch finally

    这篇文章主要介绍了C#中的异常处理问题try catch finally,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11

最新评论