我通过以下方式创建一个线程:
Thread newThread= new Thread(DoSomeWork);
.
.
.
private void DoSomeWork()
{
}
这与工作线程有什么不同吗?如果有区别...哪一个更好,我应该在什么情况下使用工作线程? 我的应用程序需要有很多线程来进行监视、刷新等操作。
我通过以下方式创建一个线程:
Thread newThread= new Thread(DoSomeWork);
.
.
.
private void DoSomeWork()
{
}
这与工作线程有什么不同吗?如果有区别...哪一个更好,我应该在什么情况下使用工作线程? 我的应用程序需要有很多线程来进行监视、刷新等操作。
我试图以一种简单的方式解释这个概念,希望能帮助更好地理解“工作线程”的概念。
“工作线程”只是一个线程,它运行以执行某些后台工作,顺从他的上级(我们可以称之为“客户”)的命令,并将工作结果更新给客户。
工作线程通常被定义为在客户请求时激活的线程。
1- 我们有一个披萨店,那里有10个专家,他们擅长准备美味的披萨。这些人被称为“工作线程”。
2- 我们有一个接受顾客订单的人。这个人被称为“客户”。每当有新的订单到来时,一个“工作线程”开始准备披萨,并在披萨准备好后向客户更新。
3- 当订单少于10个时,一些工人就会闲置下来。
4- 当订单超过10个时,订单会被放入等待队列中。
1- 有一个应用程序服务器监听8080端口。
2- 有一个请求在8080端口上进入。
3- 监听线程(被称为“客户”)接收该请求并将其分派到完成请求的“工作线程”中。实际上,在应用程序服务器上维护了许多“工作线程”对象池。
4- 如果同时有两个请求,则分配两个工作线程,任务会同时执行。
通常,“工作者线程”一词用于描述在当前线程上执行工作的另一个线程,而这在许多情况下是前台或UI线程。然而,这并非铁板钉钉。
Windows程序通常使用单个“主”线程来管理UI,并且通常是同步的(即按顺序运行)。如果有长时间运行的任务需要执行,则为避免在这些类型的程序中阻塞UI,您可以使用工作者线程(可以是前台线程或后台线程)来异步执行工作,并将结果呈现给主线程以供消耗。
在Windows程序中,这是通过消息完成的。如果您使用特定的库,例如.net框架,则可用特殊的实用程序类(如ThreadPool和BackgroundWorker)来使后台或工作者线程处理更轻松。但是,您始终可以使用平台原语来实现相同的目的。
WaitForSingleObject()
和PeekMessage()
)来循环解决此问题。(如果您想使用该技术,请参见此答案。)创建一个线程来执行这些长时间的进程可以避免执行这些循环。 - RobH除了术语之外,我想不到什么技术上的差别。
Worker线程被称为这样是因为它们正在等待某些作业到来,并在由其他人分配作业时执行该作业。例如,Web服务器进程接收请求并将其分配给其池中的线程进行处理。该线程遵循进程并完成工作,然后返回池。在此期间,主线程将执行其他任务。
对于您的目的:
持续监视数据库以识别更新/新值是必需的。它可以只是一个线程,始终在后台运行,定期唤醒并从数据库更新UI中的值。
实际上有一些区别,但并不是非常明显。在微软的文档中,我没有找到"worker thread"这样的术语。在Jeffrey Richter的书(CLR via C# (Developer Reference) 4th Edition by Jeffrey Richter)中,在章节"How worker threads are managed"中有一个解释:"当非工作线程调度任务时,任务将被添加到全局队列中。但是,每个工作线程都有自己的本地队列,当工作线程调度任务时,任务将被添加到调用线程的本地队列中。"
你可以找到一些证据。如果你观察 System.Threading.ThreadPool 中的 QueueUserWorkItem 方法,你会看到它使用 forceGlobal:true 标志进行排队,并且当使用 TaskCreationOptions.PreferFairness 作为参数调用 UnsafeQueueUserWorkItemInternal 来排队任务时,ThreadPoolTaskScheduler 将被使用,其中相反的将使用 forceGlobal 标志。
Microsoft 对不同类型队列有解释:msdn。
因此你可以通过不同的队列区分工作线程,但这只是针对具体线程行为的抽象。