从后台工作线程加载所有内容是一个不好的想法吗?
当前代码在Form_load事件中执行,我们从Web服务中获取了大量数据。一些长时间运行的工作在后台工作线程中。
无论代码大小如何,从后台工作线程加载所有内容是否是个不好的想法?每个函数都在后台工作线程中运行吗?还是这会使代码变得混乱,成为多线程噩梦?
谢谢。
从后台工作线程加载所有内容是一个不好的想法吗?
当前代码在Form_load事件中执行,我们从Web服务中获取了大量数据。一些长时间运行的工作在后台工作线程中。
无论代码大小如何,从后台工作线程加载所有内容是否是个不好的想法?每个函数都在后台工作线程中运行吗?还是这会使代码变得混乱,成为多线程噩梦?
谢谢。
BackgroundWorker
通常用于使 Winforms UI 更加响应。虽然你可以在 Web 应用程序中使用它进行后台处理,但我却不这样做;我在 Windows Service 中使用 ThreadPool
。
将潜在的长时间运行的代码放入后台工人中,以保持应用程序的响应是很好的,但没有必要将所有内容都作为后台工人。
如果您的代码调用Web服务(或任何可能超时的外部系统),或执行某些可能需要较长时间的操作,那么将其放入后台工人是一个不错的选择,但如果任何操作一直需要少于一秒钟的时间才能执行,我可能不会费心去做。
后台工作者将花费额外的时间来创建和销毁后台工作者的线程。如果它是一小段代码(在处理方面),则使用主UI线程可能会更快。
如果可维护性是关键,也许使用后台工作者进行处理可能是解决方案。一种自动处理详细信息的自定义框架可能会使代码更易于维护。
这取决于几个因素:
这是一个好主意还是不好,很大程度上取决于您的问题的具体情况。您是否必须在一个调用中获取所有数据,还是可以分别获取?
如果是一个长时间运行的 Web 服务调用,那么将其放在线程上对您没有任何帮助。最好的情况是几个独立的、长时间运行的块,需要大约相同的时间返回。
此外,在 WebForms 中(因为您提到了 Page_Load),我IRC 您将与 asp.net 共享线程池,并且在某些并发请求/用户的阈值下,可能会导致您的应用程序整体响应变差。
从你提到的"Page_Load"来看,似乎你正在一个ASP.NET Web表单中实现这个。如果是这样,并且你想异步调用一个Web服务,那么你应该使用服务的Begin和End invoke函数。如果你需要同时调用多个Web服务而不是顺序调用它们,那么这种方法尤为有效。
享受!