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 热重载的操作方法

    在运行时编辑代码的 .NET 热重载的操作方法 在 .NET 中,我们可以使用热重载来在运行时编辑代码,而无需重新启动应用程序。这对于开发人员来说非常方便,因为它可以节省大量的时间。本攻略将介绍如何在 .NET 中使用热重载。 步骤 以下是在 .NET 中使用热重载的步骤: 安装 Microsoft.DotNet.Watcher.Tools。 在命令行中运行…

    C# 2023年5月17日
    00
  • C#使用二分查找法判断指定字符的方法

    下面为您详细讲解“C#使用二分查找法判断指定字符的方法”的完整攻略。 什么是二分查找法 二分查找,也称折半查找,是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或小于中间元素,则搜索下一次查找的数组区间为当前数组区间的左半部分或右半部分。依此类推,直到找到要查找的…

    C# 2023年6月7日
    00
  • C#获取CPU处理器核心数量的方法

    获取CPU处理器核心数量是一项常见的系统信息查询任务,本文将详细讲解C#获取CPU处理器核心数量的方法。 1. .NET Framework中获取CPU核心数量的方法 .NET Framework提供了一个名为Environment的类,可以使用该类的ProcessorCount属性轻松地获取CPU核心数量。 int coreCount = Environm…

    C# 2023年6月2日
    00
  • c# 文件压缩zip或将zip文件解压的方法

    请看下面的详细讲解: 1. c# 文件压缩zip的方法 1.1 引用System.IO.Compression和System.IO.Compression.FileSystem命名空间 using System.IO.Compression; using System.IO.Compression.FileSystem; 1.2 创建压缩文件方法 // 压缩…

    C# 2023年6月1日
    00
  • 深入理解C#指针之美

    深入理解C#指针之美 指针是计算机科学中相对较为高级的概念,C#作为一门高级语言,也为我们提供了对指针的支持。理解指针的概念和使用方法,有利于我们更好地编写高效的代码。本文将详细讲解C#指针的相关知识,包括指针的定义、初始化、取值、指针运算和指针与引用类型的关系等内容。 概述 指针是一种特殊的变量,它不仅可以存储一个数据的地址,而且可以使用该地址访问该数据。…

    C# 2023年6月6日
    00
  • C#中DataSet,DataTable,DataView的区别与用法

    C#中DataSet,DataTable,DataView是ADO.NET中三种重要的数据对象,它们在数据的处理中起着非常重的作用。下面我们对它们的区别与用法进行详细讲解: DataSet DataSet是一种独立于数据源的内存数据结构,它可以存储多个表格,表格可以有关系。DataSet可以被称之为是对于多个DataTable的集合。DataSet提供一种存…

    C# 2023年5月31日
    00
  • CommunityToolkit.Mvvm8.1 MVVM工具包安装引用指南(1)

      本系列文章导航 https://www.cnblogs.com/aierong/category/2297596.html     0.说明 CommunityToolkit.Mvvm包(又名MVVM 工具包,以前名为 Microsoft.Toolkit.Mvvm)是一个现代、快速且模块化的 MVVM 库。它支持:.NET Standard 2.0、 .…

    C# 2023年4月18日
    00
  • 深入浅析C# 11 对 ref 和 struct 的改进

    深入浅析C# 11 对 ref 和 struct 的改进 简介 C# 11 是微软新推出的一项编程语言的更新版本,其中包含了对于 ref 和 struct 的一些优化改进。此次改进旨在提高代码的运行效率并降低代码运行的堆内存的占用。为了能够更好地理解这些改进,需要先了解 ref 和 struct 的相关知识。 ref 和 struct 在 C# 中,ref …

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