c# winform 关闭窗体时同时结束线程实现思路

一、背景

在使用C# Winform编写程序时,有时候我们需要在关闭窗体的时候同时结束线程。但是在代码实现中,由于线程和UI控件属于不同的线程,因此需要注意一些细节问题。下面是具体的实现思路。

二、实现思路

1.启动线程

我们需要在用户打开窗体的时候启动线程。这个步骤可以放在窗体的Load事件中:

private Thread workThread;

private void Form_Load(object sender, EventArgs e)
{
    workThread = new Thread(new ThreadStart(WorkThreadFunction));
    workThread.IsBackground = true;
    workThread.Start();
}

这里需要注意的是,我们需要将线程的IsBackground属性设置为true,这样在窗体关闭的时候,线程会自动结束。

2.关闭线程

为了关闭线程,我们需要在窗体关闭的时候停止线程。这个可以放在窗体的Closing事件中:

private void Form_Closing(object sender, FormClosingEventArgs e)
{
    if (workThread != null && workThread.IsAlive)
    {
        workThread.Abort();
    }
}

这里需要注意的是,我们需要先判断线程是否还在运行,如果线程已经结束,或者没有运行,直接忽略这个操作,否则我们可以使用Thread.Abort()方法终止线程。

3.处理线程中的UI控件

在线程中操作UI控件会引发线程安全问题,因此如果我们需要在线程中操作UI控件,需要使用Invoke方法:

private void WorkThreadFunction()
{
    while (true)
    {
        //处理线程逻辑

        if (this.InvokeRequired)
        {
            this.Invoke(new Action(() =>
            {
                //操作UI控件
            }));
        }
        else
        {
            //操作UI控件
        }
    }
}

在这个示例中,我们使用了Invoke方法来处理UI控件,这样就可以避免线程安全问题。

三、示例说明

1.简单示例

下面是一个简单的示例,演示了如何在Winform关闭的时候结束线程。

using System;
using System.Threading;
using System.Windows.Forms;

namespace WinformCloseThread
{
    public partial class Form1 : Form
    {
        private Thread workThread;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            workThread = new Thread(WorkThreadFunction);
            workThread.IsBackground = true;
            workThread.Start();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (workThread != null && workThread.IsAlive)
            {
                workThread.Abort();
            }
        }

        private void WorkThreadFunction()
        {
            while (true)
            {
                //处理线程逻辑

                if (this.InvokeRequired)
                {
                    this.Invoke(new Action(() =>
                    {
                        //操作UI控件
                    }));
                }
                else
                {
                    //操作UI控件
                }
            }
        }
    }
}

2.使用BackgroundWorker

BackgroundWorker类是.NET提供的一个异步操作类,非常适合在Winform编程中使用。下面是一个使用BackgroundWorker类的示例:

using System;
using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;

namespace WinformCloseThread
{
    public partial class Form2 : Form
    {
        private BackgroundWorker worker;

        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            worker = new BackgroundWorker();
            worker.WorkerReportsProgress = true;
            worker.WorkerSupportsCancellation = true;
            worker.DoWork += Worker_DoWork;
            worker.ProgressChanged += Worker_ProgressChanged;
            worker.RunWorkerCompleted += Worker_RunWorkerCompleted;

            worker.RunWorkerAsync();
        }

        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (worker != null && worker.IsBusy)
            {
                worker.CancelAsync();
                e.Cancel = true;
            }
        }

        private void Worker_DoWork(object sender, DoWorkEventArgs e)
        {
            var worker = sender as BackgroundWorker;

            while (!worker.CancellationPending)
            {
                //处理异步操作

                worker.ReportProgress(0, "操作完成");
                Thread.Sleep(1000);
            }

            e.Cancel = true;
        }

        private void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            //更新UI控件
        }

        private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                MessageBox.Show(e.Error.Message);
            }

            if (!e.Cancelled)
            {
                MessageBox.Show("操作已完成");
            }

            this.Close();
        }
    }
}

在这个示例中,我们使用了BackgroundWorker类来执行异步操作。由于BackgroundWorker内部封装了线程安全的操作,因此在编写代码的时候比较简单。在窗体关闭的时候我们调用CancelAsync方法来停止异步操作,然后在RunWorkerCompleted事件中关闭窗体。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# winform 关闭窗体时同时结束线程实现思路 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • .Net动态生成controller遇到的坑

    .Net动态生成controller遇到的坑 简述 在使用.NET开发Web应用程序的过程中,我们常常需要动态地生成Controller。但是这个过程中会遇到一些坑,难以发现并解决。本文将详细讲解这些坑以及如何避免它们。 问题 1. 动态添加的controller无法被MVC框架识别 动态添加Controller后,通过浏览器访问应用程序时,MVC框架会报4…

    C# 2023年5月31日
    00
  • C#各种异常处理方式总结

    C#各种异常处理方式总结 什么是异常? 异常是指在程序运行过程中遇到的错误或情况,可以是处理到了程序正常运行范围之外的数据输入或其他问题。 异常处理的意义 在编写程序时,我们需要预先考虑到可能出现的异常情况,以规避程序崩溃或数据丢失等问题。异常处理可以帮助我们及时捕获异常并进行处理,避免程序崩溃或数据不完整。 异常处理方式 C#提供了多种异常处理方式,包括使…

    C# 2023年5月15日
    00
  • C# Double转化为String时的保留位数及格式方式

    下面是详细的讲解“C# Double转化为String时的保留位数及格式方式”的完整攻略。 格式化字符串 在 C# 中,可以使用 string.Format() 或 $”” 来将 double 类型转化为字符串。这两种方式都可以通过格式化字符串来进行保留位数及格式的设置。 保留固定位数 保留 double 类型变量小数点后的固定位数有两种方式: 第一种,使用…

    C# 2023年6月8日
    00
  • 记一次 .NET 某外贸ERP 内存暴涨分析

    一:背景 1. 讲故事 上周有位朋友找到我,说他的 API 被多次调用后出现了内存暴涨,让我帮忙看下是怎么回事?看样子是有些担心,但也不是特别担心,那既然找到我,就给他分析一下吧。 二:WinDbg 分析 1. 到底是哪里的泄露 这也是我一直在训练营灌输的理念,一定要知道是哪一边的暴涨,否则很可能就南辕北辙了,使用 !address -summary 和 !…

    C# 2023年4月24日
    00
  • 什么是机器视觉?

    由于当前社会人力成本越来越昂贵,机器取代人力是大势所趋,自动化的发展也随之越来越快 。当制造公司需 要一双手和一对 眼睛的时候却不得不雇佣一个人的苦恼日益加重,而传统的机器设计和电气自动化的发展,解决一双手的问题已经渐渐得到了缓解,现在就到了需要解决一双眼睛的时候,机器视觉的出现和广泛应用也随着到来。 机器视觉是计算机科学的一个重要分支,它综合了光学,机械,…

    C# 2023年4月24日
    00
  • 利用Warensoft Stock Service编写高频交易软件

    利用Warensoft Stock Service编写高频交易软件需要具备一定的编程和交易知识。下面是一些步骤,可以帮助您开始: 1. 注册并开通Warensoft帐户 Warensoft是提供互联网股票交易服务的平台。首先,需要在Warensoft官网上注册一个帐户,并通过实名认证等方式完成开户流程。注册后,可以使用Warensoft Stock Serv…

    C# 2023年6月6日
    00
  • C# 爬虫简单教程

    关于“C#爬虫简单教程”的完整攻略,可以分为以下几个步骤: 1. 确定需求和目标 在开始写爬虫之前,首先需要确定爬虫的目标和需求,例如要爬取哪些网站,获取哪些数据,以及存储数据的方式等等。在确定需求的基础上,就可以开始编写代码了。 2. 安装和准备开发环境 使用C#编写爬虫,需要安装.Net框架和Visual Studio开发环境。具体安装过程可以参考微软官…

    C# 2023年5月15日
    00
  • C#编程读取文档Doc、Docx及Pdf内容的方法

    针对这个问题,我来详细讲解一下 “C#编程读取文档Doc、Docx及Pdf内容的方法” 的完整攻略。 问题背景 很多网站都需要解析文档内容来展示,但是文档的种类很多,而且格式各不相同,如Docx、Doc和PDF等。因此,需要在C#编程中编写一种方法来读取这些文档的内容。 解决方案 针对这个问题,我们可以使用以下两种方法来解决: 方法一:使用Microsoft…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部