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日

相关文章

  • C和Java没那么香了,Serverless时代Rust即将称王?

    C和Java没那么香了,Serverless时代Rust即将称王? 什么是Serverless? Serverless是一种计算模型,开发者无需操心服务器资源的预配置、扩缩容等操作,只需编写业务逻辑代码,并通过特定平台触发运行。它成为现代云计算架构中的一个趋势。 Rust为何具有Serverless优势? Rust是一门系统级编程语言,可以提供高效、低成本的…

    C# 2023年6月6日
    00
  • ASP.NET Core MVC 从入门到精通之路由

    随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。 经过前几篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启…

    C# 2023年4月19日
    00
  • C#先判断是否存在再创建文件夹或文件与递归计算文件夹大小

    下面是关于“C#先判断是否存在再创建文件夹或文件与递归计算文件夹大小”的详细攻略。 1. 先判断是否存在再创建文件夹或文件 在C#中,我们可以使用System.IO.Directory和System.IO.File类来创建文件夹或文件,并且可以通过相应的方法,判断是否存在。 1.1 判断文件夹是否存在并创建文件夹 如果我们需要判断一个文件夹是否存在,并在不存…

    C# 2023年5月15日
    00
  • .Net Core 3.1 Web API基础知识详解(收藏)

    .Net Core 3.1 Web API基础知识详解攻略 在本攻略中,我们将深入讲解.Net Core 3.1 Web API的基础知识,并提供两个示例说明。 什么是.Net Core 3.1 Web API? .Net Core 3.1 Web API是一种基于RESTful架构的Web服务,用于提供数据和功能给客户端应用程序。它是使用.Net Core…

    C# 2023年5月17日
    00
  • .Net core下直接执行SQL语句并生成DataTable的实现方法

    下面是“.Net core下直接执行SQL语句并生成DataTable的实现方法”的攻略: 1. 安装依赖 首先需要在项目中安装相关的依赖包,这里推荐使用 Microsoft.Data.SqlClient 包,该包是 Microsoft 官方提供的 .NET Core 平台下功能最强大的 SQL Server 数据库访问驱动。可以通过 NuGet 包管理器安…

    C# 2023年6月3日
    00
  • C#如何防止程序多次运行的技巧

    C#如何防止程序多次运行的技巧有多种,下面我们将介绍两种实现方法。 方法一:利用文件锁 利用文件锁是一种简单有效的防止程序多次运行的技巧。具体实现方法如下: 首先在程序的入口处创建一个文件,例如使用FileStream类创建一个空的文件,命名为lockfile: using System.IO; // … FileStream fs = new File…

    C# 2023年5月15日
    00
  • C# String.Equals()方法: 比较两个字符串是否相等

    String.Equals()方法用于比较两个字符串对象的值是否相等,返回一个布尔值。该方法有多种重载形式,可以按照需要选择不同的形式使用。 下面详细讲解String.Equals()的作用和使用方法: 作用 String.Equals()方法用于比较两个字符串对象的值是否相等,返回一个布尔值。该方法可以用于比较任意两个字符串,包括空字符串,但需要注意的是,…

    C# 2023年4月19日
    00
  • C# 限制输入为字母或数字以及长度

    日常开发过程中,验证字符的合法性一直是一个必不可少的步骤,以前都是在用户输入完再做判断,不仅麻烦在不符合标准的时候还要提示用户修改,体验很差,为什么不在输入的时候加以限制呢? 以 Winform的TextBox控件为例,这里提供两种方案: 通过字符匹配 正则表达式 在用户输入时限制,所以选用KeyPress事件。 字符匹配 private void txt_…

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