首页 > 其他分享 >在线程中更新UI

在线程中更新UI

时间:2022-10-24 15:11:26浏览次数:80  
标签:在线 using System 程中 mark Form1 线程 new UI

为了更新UI线程,在新线程中用this.Invoke来更新UI上控件的值。

其实这背后是有异常的(有可能会在vs中报出来),因为当你关闭窗体时,this已经不存在了,但访问this.Invoke在新的线程中,新线程本身并没有关掉,这时就会报找不到实例而引发报错。

有可能运行起来并不会发现异常,这是因为主线程关闭后,所有创建的子线程都会关闭的。

 

解决方案:

方法1:

参考:Timer控件-Forms.Timer\System.Timers.Timer\System.Threading.Timer - hanzq_go - 博客园 (cnblogs.com)

        private void FormTimer1_FormClosed(object sender, FormClosedEventArgs e)
        {
            System.Environment.Exit(0);//结束进程
        }

 

方法2:

通过一个mark标志,在关闭窗体时,拦截一下,把子线程关闭,然后再把主窗体关闭,这样就没有问题了,自己起的线程,自己要关掉。

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Load += Form1_Load;
            this.FormClosing += Form1_FormClosing;
            
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (mark)
            {
                e.Cancel = true;
                mark = false;
            }
        }

        static List<Item> list;
        private void Form1_Load(object sender, EventArgs e)
        {
            list = new List<Item>
            {
                new Item{ Name="正在上传诊疗项目",Time=8 },
                new Item{ Name="正在上传器材",Time=10 },
                new Item{ Name="正在上传药品",Time=10 },
                new Item{ Name="正在核对",Time=12 }
            };
        }
        static bool mark;
        private void button1_Click(object sender, EventArgs e)
        {
            mark = true;
            Task.Run(() =>
            {
                foreach (var item in list)
                {
                    if (mark == false)
                    {
                        break;
                    }
                    var dotString = "";
                    for (var i = 0; i < item.Time; i++)
                    {
                        if (mark == false)
                        {
                            break;
                        }
                        if (i % 6 == 0)
                        {
                            dotString = ".";
                        }
                        else
                        {
                            dotString += ".";
                        }
                        this.Invoke(new Action(() => messageLabel.Text = $"{item.Name}{dotString}"));
                        Thread.Sleep(100);
                    }
                }
                //MessageBox.Show("完成医保所有数据同步");
                if (mark)
                {
                    mark = false;
                    MessageBox.Show("完成医保所有数据同步");
                }
                else
                {
                    this.Invoke(new Action(() => { this.Close(); }));
                }

            });
        }
    }
}

 

标签:在线,using,System,程中,mark,Form1,线程,new,UI
From: https://www.cnblogs.com/hanzq/p/16821519.html

相关文章

  • java类uuid源码分析
    通用唯一识别码(英语:UniversallyUniqueIdentifier,简称UUID)是一种软件建构的标准,亦为自由软件基金会组织在分散式计算环境领域的一部份。UUID的目的,是让分散式系统中的所有......
  • 数据库连接池_druid_基本使用与数据库连接池_druid_工具类与数据库连接池_druid_工具
    数据库连接池_druid_基本使用Druid:数据库连接池实现技术,由阿里巴巴提供的步骤:1.导入jar包:druid-1.0.9.jar2.定义配置文件......
  • 熟悉javaweb过程中遇到的问题-01
    Cause:org.apache.ibatis.builder.BuilderException:ErrorparsingSQLMapperConfiguration.Cause:org.apache.ibatis.builder.BuilderException:Errorcreatingd......
  • 制作arduino蓝牙模块接收app(App inventor的简单使用)
    组件如下:APP界面如下(码了logo):功能概述选择设备进行蓝牙选择接收arduino发送的文本,存储到变量中,显示在温湿度显示的标签中断开连接可以断开蓝牙连接,并让断开......
  • MSBuild Community Tasks Project
    MSBuild是Microsoft和VisualStudio的新生成平台。​​MSBuild概念​​​ 解释属性、任务、目标和其他MSBuild组件背后的概念。​​​用于排除MSBuild错......
  • 从arduino导入到VScode中报错无法通过编译
    这个问题之前就遇到过,最近接触的一个项目又遇到这个问题了,想和大家分享一下列举一个我的小项目,主要就是通过点灯科技的库来和手机小爱同学进行联动,如果有热爱于电子没玩过......
  • kernel——Kbuild
    0.kbuild的组成0.1构成文件顶层Makefile.configarch/$(ARCH)/Makefile各个目录下的Makefilescripts/Makefile.*0.2预定义的目标和变量obj-mobj-yxxx-objszIm......
  • vue create xxx创建项目过程中报错的解决方法
    vuecreatexxx创建项目过程中报错的解决方法​​报错图例​​​​解决办法​​报错图例解决办法首先检查电脑里是否安装node.js检查方法:命令行输入node-v还要再输入一个......
  • Unity 使整个UnityUI变成彩色的BUG
    最近接手了一个两年前的老项目,在这个项目里碰到一个BUG,每次运行到这个场景的时候,整个Unity的所有UI包括Unity界面都会变成彩色。后来发现是因为物体丢失,代码修改Ima......
  • VMware vRealize Suite Lifecycle Manager 8.10 - vRealize Suite 生命周期和内容管理
    请访问原文链接:https://sysin.cn/blog/vmware-vrslm-8/,查看最新版。原创作品,转载请保留出处。作者主页:www.sysin.org使用vRealizeSuiteLifecycleManager管理vRea......