线程篇(主线程(UI线程),后台线程,线程池线程)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:线程笔记:

后续不间断增加、


提示:以下是本篇文章正文内容,下面案例可供参考

一、线程使用场景

  1. 主线程(UI线程):主线程通常用于处理用户界面相关的逻辑,例如创建和显示窗体、处理用户输入、更新UI等操作。主线程是一个单线程的执行环境,所有的UI控件都必须在主线程上创建和更新,否则会引发跨线程访问的异常。因此,我们应该尽可能地将长时间运行的任务和耗时的操作移动到其他线程上执行,以避免阻塞主线程。

  2. 后台线程:后台线程通常用于处理一些非UI相关的任务,例如读取文件、计算数据、网络请求等操作。后台线程可以使用Thread类或Task类来创建和管理,但是需要注意的是,在使用后台线程时,我们需要自己负责管理线程的生命周期和同步机制,以避免线程间的竞争和死锁等问题。

二、使用步骤

主线程(UI线程)

 // 在UI线程上执行
    this.Invoke(new Action(() => {
        label1.Text = "Hello, World!";
    }));


     this.Invoke((MethodInvoker)delegate{
        label1.Text = "Hello, World!";
    });

两则是同理都可以用在UI操作只是委托类型不同

      this.Invoke((EventHandler)delegate{


      }));

 分析

这两段代码都是在UI线程上执行一个委托,以确保UI更新的线程安全性。两者的区别在于使用的委托类型不同。

在第一段代码中,使用的是一个泛型委托类型Action,它用于表示一个没有返回值并且没有参数的委托。因此,在这个示例中,使用了一个没有参数和返回值的匿名方法来创建Action委托。

在第二段代码中,使用的是MethodInvoker委托类型,它也表示一个没有参数和返回值的委托。MethodInvoker委托类型是C#语言中的预定义委托类型,用于在UI线程上执行一个方法。

在第三段代码中,使用了EventHandler委托类型来创建一个委托实例,然后使用Control.Invoke方法来在UI线程上调用该委托。这个例子中的委托与之前提到的ActionMethodInvoker委托有所不同,因为它带有一个object senderEventArgs e参数,用于处理事件。

EventHandler是一种预定义的委托类型,它接受两个参数:一个object类型的sender对象和一个EventArgs类型的e事件参数。它通常用于处理事件,因为事件处理器方法的签名需要与EventHandler委托类型匹配。

总之,EventHandler是一种预定义的委托类型,用于处理事件。它带有一个object类型的sender对象和一个EventArgs类型的e事件参数,用于处理事件。使用EventHandler委托类型可以方便地与事件处理器方法进行交互,并确保事件处理器在UI线程上执行。

后台线程

Task.Run的好像都是后台线程、

Task.Run(() =>{
//某方法
}).ContinueWith(t =>{
                 //等待某方法执行完后执行
                    }, TaskScheduler.Default);

分析

这段代码和前面提供的代码类似,但是它使用了一个不同的重载形式,即指定了TaskScheduler.Default参数来控制任务的调度方式。

TaskScheduler.Default是一个静态属性,它返回一个默认的任务调度器,该调度器用于调度新任务的执行。在大多数情况下,这个调度器使用的是一个线程池,它会自动调度任务到不同的线程上执行。

在这个例子中,Task.Run方法接受一个空的匿名方法,该方法没有实际的代码,只是用来创建一个空的任务。然后使用ContinueWith方法来指定在任务完成后要执行的操作,该方法也接受一个匿名方法作为参数,可以在其中添加一些额外的逻辑,例如更新UI、记录日志等。

通过指定TaskScheduler.Default参数,我们可以控制任务的调度方式。在这个例子中,任务将在默认的任务调度器上执行,该调度器使用的是一个线程池,它会自动调度任务到不同的线程上执行。

总之,Task.Run方法可以将一个委托方法在后台线程上执行,并返回一个Task对象,用于跟踪任务的执行状态。ContinueWith方法可以在任务完成后执行指定的操作,例如更新UI、记录日志等。通过指定TaskScheduler.Default参数,我们可以控制任务的调度方式。这些方法可以很方便地帮助我们编写异步、并发的代码,提高程序的性能和响应速度。


总结

总之,不同的线程类型适用于不同的场景,我们需要根据具体的需求来选择合适的线程类型。在使用线程时,我们需要注意线程的生命周期、同步机制、异常处理、性能优化等方面的问题,以保证线程的稳定性和可靠性。

  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值