背景工人C#winform

时间:2010-07-01 23:09:26

标签: c# winforms multithreading backgroundworker

从后台工作者加载所有内容是一个坏主意吗? 当前代码在Form_load上执行。我们从webservice中提取了大量数据。一些长期运行的作品是在后台工作者。

从背景工作者加载所有内容是不是一个坏主意,无论代码有多小或多大? 在后台工作程序中运行的每个函数? 或者这会使这段代码变得混乱和踩踏噩梦。

谢谢。

7 个答案:

答案 0 :(得分:2)

代码的大小不是您应该用来确定是否在单独的线程上执行工作的度量。最差的执行长度是。

首先,没有很多UI设计可以在Form_Load上解决大量工作。如果可能的话,我通常会:

  • 在响应用户操作直接打开表单之前启动该工作。
  • 将所有工作移至后台,并将结果异步更新(绑定?)到表单。
  • 延迟工作,直到用户专门执行某些需要它的操作。

无论做了多少工作,您的用户都希望/期望您的表单非常快速且响应迅速。在Form_Load期间执行可能长时间运行的操作总是会导致糟糕的用户体验。

BackgroundWorker只是一种异步执行工作的机制,还有很多其他机制。您应该选择最适合每种情况的那一种。

答案 1 :(得分:1)

BackgroundWorker通常用于使Winforms UI更具响应性。您可以将它用于Web应用程序中的后台处理,但我不这样做;我在Windows服务中使用ThreadPool

答案 2 :(得分:1)

很好地将长期运行的代码强加到后台工作程序中,以便您的应用程序保持响应,但不需要将所有作为后台工作程序。

如果您的代码调用Web服务(或可能超时的任何类型的外部系统),或者执行的操作可能需要超过几秒钟,那么这将是一个很好的候选人,可以放入后台工作者然而,如果任何事情持续不到一秒左右的时间来执行,我可能不会打扰。

答案 3 :(得分:1)

后台工作程序将花费额外的时间来为后台工作程序创建和销毁线程。如果它是一小段代码(处理方式),则使用主UI线程可能会更快。

如果可维护性是关键,可能使用后台工作程序进行处理可能是解决方案。自动处理细节的自定义框架可以使代码更易于维护。

这取决于几个因素:

  • 小/大块代码的数量 - 这将影响同时运行的线程数。
  • 应用程序的响应性和性能的重要性
  • 应用程序的可维护性/可伸缩性的重要性。

答案 4 :(得分:1)

这是否是一个好主意在很大程度上取决于你的问题的具体细节。您是否必须在一次通话中提取所有数据,还是可以在独立的块中进行?

如果它是一个长时间运行的大型Web服务调用,那么将它放在一个线程上将不会为您做任何事情。你最好的情况是几个独立的,长时间运行的块,需要大约相同的时间才能返回。

此外,在webforms(因为你提到Page_Load)IIRC你将与asp.net共享线程池,并且你可能会导致你的应用程序在并发请求/用户的某个阈值下整体响应性降低。

答案 5 :(得分:1)

就个人而言,我不会将代码放入工作线程中,除非包含特定进程的代码干扰了UI响应。我没有理由认为把所有东西放在工作线程上。通常,当您等待Web服务等外部资源时,您只有响应问题(除非您在Form_Load上计算素数: - )。

如果您尚未探索异步Web服务调用,我建议您查看一下。异步调用将为您处理线程 - 总是一件好事。

答案 6 :(得分:0)

从您对“Page_Load”的引用来看,您在ASP.NET Web表单中实现了这一点。如果是这种情况,并且您尝试异步调用Web服务,那么您应该使用该服务的Begin和End调用函数。如果您需要同时调用多个Web服务而不是同义地一次调用它们,这种方法尤其有效。

享受!