【问题标题】:Background Worker C# winform后台工作者 C# winform
【发布时间】:2023-03-12 02:02:01
【问题描述】:

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

无论代码有多大或多小,从后台工作人员加载所有内容是不是一个坏主意? 每个功能都在后台工作人员中运行? 还是这会让这段代码变得混乱和噩梦。

谢谢。

【问题讨论】:

  • 你的标题是 winform 但你提到了 page_load。这是winforms还是webforms?
  • 没有足够的替代表达沮丧。 :P

标签: c# winforms multithreading backgroundworker


【解决方案1】:

代码的大小不是您应该用来确定是否在单独的线程上执行工作的指标。最坏情况下的执行时间是。

首先,真正需要在 Form_Load 上启动大量工作的 UI 设计并不多。如果可能的话,我通常会:

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

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

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

【讨论】:

  • 这是我们遇到的问题。一些代码在 Form_load 中调用 web_service,但 web_service 有时会延迟,UI 变得无响应,客户端认为它已损坏。以前的软件是在powerbuilder里面转成C#的,把每个函数都转成web_service。他们期望比以前的软件更快,但我们提取的数据是之前的两倍:'(。谢谢你的回复。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    最好将可能长时间运行的代码粘贴到后台工作程序中,以便您的应用程序保持响应,但无需将所有内容都放在后台工作程序中。

    如果您的代码调用 Web 服务(或任何可能超时的外部系统),或执行的操作可能需要超过几秒钟的时间,那么这将是放入后台工作器的理想选择,但是如果任何事情的执行时间始终不到一秒左右,我可能不会打扰。

    【讨论】:

    • 无法达成一致。 通常需要多长时间在这里并不重要。重要的是可能需要多长时间(最坏的情况)。
    【解决方案4】:

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

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

    这取决于几个因素:

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

    【讨论】:

      【解决方案5】:

      这是否是一个好主意在很大程度上取决于您的问题的具体情况。您是否必须在一次调用中提取所有数据,或者您可以分块进行吗?

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

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

      【讨论】:

        【解决方案6】:

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

        如果您还没有探索过异步 Web 服务调用,我建议您看看。异步调用将为您处理线程 - 总是一件好事。

        【讨论】:

        • 谢谢。我将“Hello World”异步 Web 服务。 :P
        【解决方案7】:

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

        享受吧!

        【讨论】:

        • OP 在评论中澄清了这一点。我将调整问题以修复错误。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-30
        • 2011-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多