C#之窗体多线程基础

所谓多线程,就是让计算机同时处理多个事情,在一个项目里面我们都是需要进行多线程的设计。每一个运行的应用程序是一个进程,而一个进程是由多个线程组成的。

首先在新建的窗体中,我们先拖一个button和一个textbox,并且定义一个方法,实现在textbox1中的数字跳动

private void Test()
        {
            for (int i = 0; i < 10000; i++)
            {
                textBox1.Text = i.ToString();
            }
        }

然后我们点击button后会调用这个方法~

private void Button1_Click(object sender, EventArgs e)
        {
            Test();
        }

这可实现我们在textbox中循环显示一个数字~
然后我们发现在数字跳动的时候是无法移动窗体或者关闭窗体等操作的,我们必须要等循环计数完成后才可以移动或者关闭窗体,出现一个 假卡死的情况~

这时候如果我们需要进行别的操作就必须使用多线程~
首先导入using System.Threading;

private void Button1_Click(object sender, EventArgs e)
        {
            
            //创建一个线程去执行这个方法
            Thread th = new Thread(Test);
            //标记这个线程准备就绪了,可以随时被执行
            th.Start();
        }

同时在Test方法中,加入:

Control.CheckForIllegalCrossThreadCalls = false;

实现线程的跨线程访问
这是我们发现在计数输出的同时我们可以移动窗体了,意味着我们的计算机可以执行多个任务了~但是当我们需要关闭窗体的时候,如果此时计数还没有结束,一般也是会出现异常的
这是我们需要理解 前台和后台线程的概念与功能
前台线程:只有所有的前台线程都关闭才能完成线程的关闭
后台线程:只要所有的前台线程结束,后台线程会自动结束
通常我们创建的线程都是前台线程,此时我们可以通过

th.IsBackground=true;

使其变为后台线程,再点击Start();

最后,如果线程还没终止,为了防止我们在关闭窗体的时候出现异常,在
属性下的FormCloing页面加入一个条件判断~

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //当你点击关闭窗体的时候,判断线程是否为null
            if (th!= null)
            {
                th.Abort();
            }
        }

针对当前办法,是无法调用th这个局部变量的,需要我们把局部变量放到全局变量的位置进行判定。
最后放上所有的代码~

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace xiancheng
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Thread th;
        private void Button1_Click(object sender, EventArgs e)
        {
            
            //创建一个线程去执行这个方法
            th = new Thread(Test);
            //标记这个线程准备就绪了,可以随时被执行
            //th.IsBackground=true;
            th.Start();
        }

        private void Test()
        {
            for (int i = 0; i < 100000; i++)
            {
                Control.CheckForIllegalCrossThreadCalls = false;
                textBox1.Text = i.ToString();//这样写,会导致新线程去访问主线程的情况,不允许跨线程的访问
                //Control.CheckForIllegalCrossThreadCalls = false;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //Control.CheckForIllegalCrossThreadCalls = false;
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //当你点击关闭窗体的时候,判断线程是否为null
            if (th!= null)
            {
                th.Abort();
            }
        }
    }
}
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C#中,委托和多线程是常用的处理并发编程的方法。委托是一种类型,它可以存储对一个或多个方法的引用,并允许在需要时调用这些方法。通过使用委托,我们可以在不同的线程中执行不同的方法。\[2\] 在C#中,线程是使用Thread类处理的。可以通过创建Thread对象并传递一个方法作为参数来创建线程。例如,可以使用Thread类的构造函数创建一个新的线程,并将一个方法作为参数传递给它。然后,可以调用Start方法来启动线程的执行。\[1\] 然而,在使用多线程时,需要注意跨线程访问控件的问题。一般情况下,窗体的控件是属于主线程的,如果在其他线程中直接访问控件,会导致报错。为了解决这个问题,可以使用委托来在其他线程中更新控件的值。首先,需要声明一个委托类型,然后创建一个委托对象,并将要执行的方法作为参数传递给它。接下来,可以创建一个新的线程,并在该线程中调用Invoke方法来更新控件的值。\[2\] 另外,C#还提供了使用Task类来创建多线程的方法。可以使用Task.Factory.StartNew方法来创建一个新的任务,并传递一个方法作为参数。然后,可以使用Task.WaitAll方法等待所有任务执行完成,或者使用Task.WaitAny方法等待任意一个任务执行完成。\[3\] 总结起来,委托和多线程C#中处理并发编程的常用方法。委托可以用于在不同的线程中执行不同的方法,而多线程可以通过Thread类或Task类来创建和管理线程。在使用多线程时,需要注意跨线程访问控件的问题,并可以使用委托来解决这个问题。 #### 引用[.reference_title] - *1* *2* *3* [c#多线程和委托的使用](https://blog.csdn.net/qq_39559182/article/details/103954877)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thray.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值