单独使用后台工作人员

问题描述 投票:0回答:1

我正在开发Windows Forms应用程序,在主窗体中,我有两个datagridviews,它们每30分钟从网站上填充一次。对于每个datagridviews,都有不同的代码生成数据表。但是,由于我只使用一个Selenium Webdriver,所以无法并行运行代码,因此必须成环运行。

直到现在,我只使用了一个后台工作人员和一个计时器,每30分钟刷新一次datagridviews。但是,我正在尝试改进该应用程序,并为每个datagridviews放置一个刷新按钮,以便手动刷新每个。

为了做到这一点,我正在考虑为生成datagridviews的数据所需的每个代码使用一个后台工作程序。我将在WorkCompleted方法中插入用于启动第二个背景工作者的代码。但是,使用这种方法,我无法单独运行每个后台工作人员,因为如果我运行第一个,那么第二个也将运行。

我可以想到的基本方法:我可以使用bool来检测是使用计时器调用了第一个后台工作程序还是使用刷新按钮调用了该后台工作程序。在WorkCompleted方法中,我可以基于if状态放置bool语句。

但是,我不想使用这个,因为我想扩展该应用程序并放置多个datagridviews并使它更复杂。

我想不出一种聪明的方法来使其工作。使它按预期工作的最佳方法是什么?我不应该使用多个背景工作人员吗?

c# .net winforms backgroundworker
1个回答
0
投票

您需要区分多任务处理和多线程处理,并确定您真正需要的一种。许多人将多线程作为实现多任务的快速而肮脏的方法。

BackgroundWorker是一种多线程形式。但是,它不是一个好的实用工具(是吗?)。但是,它是用于多任务处理的理想训练轮。如果有人寻求建议来学习多任务处理,那么Windows Forms中的BGW是我的建议。它教您所有正确的模式。还有其他(不是必要地基于线程)多任务处理方式。诸如Tasks,Async Await,ThreadPools之类的东西。您应该调查那些中期。

同时,我认为您遇到XY问题。您不需要一个接一个地运行BGW(Y)。您需要做的是确保他们中没有两个同时使用WebDriver(X)。 Lock-Statement是完成该任务的正确工具。

只需创建所有BGW DoWork事件可以访问的单个对象。将整个DoWork事件(或仅绝对需要该事件的部分)放到那个位置上。现在,没有两个DoWorks可以同时使用驱动程序。

© www.soinside.com 2019 - 2024. All rights reserved.