C# 异步编程02

2023-11-30 19:12:56 浏览数 (2)

线程池

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。、

注意点:
使用者:
线程池的整洁

Task

由于Thread存在较多问题,我们引入Task的概念。

概念:

Task 类的表示单个操作不返回一个值,通常以异步方式执行。 通常在线程池线程上异步执行,而不是在主应用程序线程上同步执行,因此可以使用 Status 属性以及 IsCanceled 、 IsCompleted 和 IsFaulted 属性来确定任务的状态。 通常,lambda 表达式用于指定任务要执行的工作。

使用:
Wait
长时间任务

对于长时间任务,并不适合使用线程池,会造成比较大的性能影响。

返回值

Task 可以返回指定类型的数据。

异常
自治Task

这里的自治 Task 指的是一经创建就自己运行,不再进行手动管理等操作。

未观察到的异常一般是指 在一个Task执行的过程中,如果在定义的Task有效期内没有出现故障而是在之外出现了异常,则可以认为是未观察到的异常。

Continuation

continuation 一般译为继续,也就是不停下来继续。

实现 continuation 可以通过 awaiter 对象。

awaiter

awaiter 对象可以方便的实现 continuation。

对于异常,异常的捕获也十分简便且以易实现。

同步上下文

同步上下文是一种可以将工作单元排队到上下文(主要是不同的线程)的方法。 它的作用通俗来讲就是实现线程之间通讯的。 ​

同步上下文应用于很多场景,比如在WinForms和WPF中,只有一个UI线程可以更新UI元素(文本框,复选框等)。如果尝试从另一个非UI线程更改文本框的内容,则不会发生更改,也可能抛出异常(取决于UI框架)。因此,在这样的应用程序中,非UI线程需要将对UI元素的所有更改安排到UI线程。这就是同步上下文提供的内容。它允许将一个工作单元(执行某些方法)发布到不同的上下文 - 在这种情况下是UI线程。 ​

无论使用哪种平台(ASP.NET 、WinForm 、WPF 等),所有.NET程序都包含同步上下文的概念。Microsoft .NET Framework提供了同步上下文的SynchronizationContext类。根据平台框架不同,又单独提供了WindowsFormsSynchronizationContext(WinForm)类、DispatcherSynchronizationContext(WPF)类等同步上下文的模型但都是继承自SynchronizationContext类。 参考:https://blog.csdn.net/starrycraft/article/details/113658608

TaskCompletionSource

使用:

0 人点赞