关于调用方法的各种方式

本文关键字:方式 方法 于调用 调用 | 更新日期: 2023-09-27 18:11:29

我很少使用线程,后台工作器等,但从来没有试图知道我们应该使用哪一个,以及每个技术如何在内部工作。所以在这里我问一些关于线程,异步调用方法,后台工作者或TPL的问题。我在这里道歉,我没有问什么问题。我的要求是请仔细阅读并详细回答。

  1. 当我们运行应用程序时,应用程序从一个线程开始,这个线程被称为主线程。GUI相关的控件是在另一个线程上创建的,我听到了....这是真的吗?有没有为GUI创建线程?

  2. 当我们调用几个方法时,所有的方法调用都是顺序发生的,这意味着一个方法调用stand &结束后,next方法将启动,一切都在主线程中进行。这就是主线程被阻塞的原因。如果我们不想阻塞主线程,那么我们总是喜欢在另一个线程上异步运行方法。异步调用任何方法意味着在单独的线程上执行方法是真的吗?如果不是,这是否意味着异步调用在同一线程中执行的任何方法而不阻塞主线程?如果是,那怎么可能呢?

  3. 当我们异步调用任何不阻塞主线程的方法时,实际发生了什么?我需要知道幕后发生了什么。

  4. 通过线程调用方法的区别是什么?

  5. 在同一个主线程还是在单独的线程中异步执行方法?

  6. 当我们用线程调用方法时。然后我如何指定回调当我的方法完成时回调会发生让我知道方法完成。我试图用线程找到这样的例子。开始了,但一无所获。

  7. 任务并行库的主要目标是什么。TPL是否在主线程或单独线程中执行任何方法?

可以使用thread。启动或后台工作或异步调用任何方法来解决我们的目的,那么人们使用TPL有什么额外的东西?

关于调用方法的各种方式

您的GUI线程与您的应用程序启动时的威胁线程相同。默认情况下,你的应用程序只是一个单线程(好吧…在后台是多个线程,但那些处理一些。net的东西,如垃圾收集,你不需要担心)。

除了主线程之外,还有多种线程机制。它们本质上都使用相同的东西:Thread类。所以,是的,所有其他线程操作都不在主线程上运行。

每个线程机制都有优点和缺点:

线程类


线程类是它们的基础。您可以启动它、加入它(等待它完成)和中止它(不建议使用Abort)。创建一个新线程需要相当多的时间(在我的机器上+/- 5毫秒)。它不提供任何其他同步机制作为回调。你得自己写。

ThreadPool
因为线程的创建非常缓慢,所以。net有一个线程池。线程池为异步操作做好了准备。当异步操作进入队列时,线程池会将其拾取并将其分配给已经创建的空闲线程。线程将执行该操作。您可以使用ThreadPool.QueueUserWorkItem将操作排队。回调是可能的。TreadPool应该只用于快速操作。I/O操作可能占用大量时间,这可能会阻塞其他排队操作。

异步调用
. net有很多不同的异步调用,比如委托InvokeAsync。大多数这些操作都被推入线程池的队列中,因此所有这些方法也都支持线程池。非常方便。像(StreamReader.BeginRead)这样的大多数I/O操作都是在新创建的线程上执行的。

BackgroundWorker
BackgroundWorker也使用ThreadPool来处理它的所有操作。


parallel类是在。net框架4.0中出现的。创建它是为了使对(大型)集合的操作更容易。需要在集合内的所有项上完成的所有操作都被划分为几个线程(在TreadPool上),从而允许将工作负载分配到多核处理器的所有内核上。