我很少与线程,后台工作者等合作,但从不试图知道我们应该使用哪一个以及每种技术如何在内部工作。所以我在这里问几个关于线程,异步调用方法,后台工作者或TPL的问题。我在这里道歉,我问了几个问题。我的要求是请阅读并详细解答。
当我们运行我们的应用程序时,应用程序以一个称为主线程的线程开始。 GUI相关控件是在另一个线程上创建的,我听到了多远......是真的吗?是否为GUI创建了任何线程?
当我们调用几个方法然后所有方法调用顺序发生意味着一个方法调用stand&结束然后下一个方法将出星,一切都发生在主线程中。这就是主线程被阻止的原因。如果我们不想阻塞主线程那么我们总是喜欢在另一个线程上运行方法意味着异步。是不是异步调用任何方法意味着在单独的线程上执行方法?如果不是,它是否意味着异步调用在同一线程中执行而不阻塞主线程的任何方法?如果是,那么它是如何可能的。请详细说明。
当我们异步调用任何不阻塞主线程的方法时会发生什么?我需要知道窗帘后面发生了什么。
通过thread.start调用方法和异步调用方法有什么区别?
后台工作程序在同一主线程或单独的线程中异步执行方法?
当我们使用thread.start调用方法时,如何指定回调,当我的方法完成时,将发生回调并让我知道方法完成。我尝试用thread.start找到这样的例子,但没有找到。所以请帮我用示例代码来做。
任务并行库的主要目标是什么。 TPL会在主线程或单独的线程中执行任何方法吗?
我们可以使用thread.start或后台工作程序,或者异步调用任何方法来解决我们的目的然后为人们使用TPL提供哪些额外的东西?
答案 0 :(得分:1)
您的GUI线程与应用程序启动的威胁是同一个线程。默认情况下,你的应用程序只是一个单独的线程(好吧......在后台是多个线程,但那些处理一些.NET的东西,如垃圾收集,你不需要担心)。
除主线程外,还有多个线程机制。所有使用基本相同的东西:Thread类。所以,是的,所有其他线程操作都不会在主线程上运行。
每个线程机制都有赞成和反对意见:
主题类
线程类是它们的基础。您可以启动它,加入(等到它完成)并中止它(Abort
已弃用,不建议使用它)。创建一个新线程需要相当多的时间(在我的机器上+/- 5毫秒)。它没有提供任何其他同步机制作为回调。你必须自己写。
<强>线程池强>
因为线程创建非常缓慢,所以.NET有一个线程池。线程池准备好进行异步操作。当异步操作排队时,线程池将其拾取并将其分配给已创建的空闲线程。线程将执行该操作。您可以使用ThreadPool.QueueUserWorkItem
对操作进行排队。可以回调。 TreadPool只应用于快速操作。 I / O操作可能会占用大量时间,这可能会阻止其他排队操作。
异步调用
.NET有很多不同的异步调用,比如代理InvokeAsync
。大多数这些操作都被推送到ThreadPool的队列中,因此所有这些方法也都支持它。非常方便。像(StreamReader.BeginRead)这样的大多数I / O操作都是在新创建的线程上执行的。
<强> BackgroundWorker的强>
BackgroundWorker还使用ThreadPool来处理其操作。
<强>并行强>
Parallel-class附带了.NET framework 4.0。它的创建使得(大型)集合上的操作更容易。需要对集合中的所有项目执行的所有操作都分为几个线程(在TreadPool上),允许工作负载在多核处理器的所有核心上进行划分。