2014-02-14 135 views
0

我有关于后台工作人员的问题/问题。在另一个后台工作人员调用后台工作人员“RunWorkerAsync”“RunWorkerCompleted”

我在一个win窗体项目中使用VB.NET和EF5。主窗体有三个选项卡,每个选项卡都有一组不同的数据加载到它。我为我的所有数据访问使用存储库和工作单元模式。为了使UI线程不锁定,我决定在加载UI后使用后台工作人员填充每个列表。

最初在我的代码,我在我的形式加载方法如下代码:

'//Set up tasks to obtain all the data from the DB and put it in the correct listviewitem format 
    AddHandler bgGetAllOpenOrders.DoWork, AddressOf BGAllOpenOrdersListGenerator 
    AddHandler bgGetAllNeedsAttention.DoWork, AddressOf BGAllNeedsAttentionOrdersListGenerator 
    AddHandler bgGetAllStock.DoWork, AddressOf BGStockListGenerator 

    '//Set up tasks to populate the relevant lists with the relevant data when all the data has been loaded. 
    AddHandler bgGetAllOpenOrders.RunWorkerCompleted, AddressOf BGPopulateAllOpenOrders 
    AddHandler bgGetAllNeedsAttention.RunWorkerCompleted, AddressOf BGPopulateNeedsAttentionList 
    AddHandler bgGetAllStock.RunWorkerCompleted, AddressOf BGPopulateStockList 

    '//Begin running of the loading code in the background whilst the form remains open to use. 
    bgGetAllOpenOrders.RunWorkerAsync() 
    bgAllNeedsAttention.RunWorkerAsync() 
    bgGetAllStock.RunWorkerAsync() 

但是,这会导致如不总是返回所有正确的数据的各种问题,其他时间我会得到一个错误有关连接已经被打开(我试过激活MARS这并没有帮助)

于是我改变了我对负载的方法如下:

'//Set up tasks to obtain all the data from the DB and put it in the correct listviewitem format 
    AddHandler bgGetAllOpenOrders.DoWork, AddressOf BGAllOpenOrdersListGenerator 
    AddHandler bgGetAllNeedsAttention.DoWork, AddressOf BGAllNeedsAttentionOrdersListGenerator 
    AddHandler bgGetAllStock.DoWork, AddressOf BGStockListGenerator 

    '//Set up tasks to populate the relevant lists with the relevant data when all the data has been loaded. 
    AddHandler bgGetAllOpenOrders.RunWorkerCompleted, AddressOf BGPopulateAllOpenOrders 
    AddHandler bgGetAllNeedsAttention.RunWorkerCompleted, AddressOf BGPopulateNeedsAttentionList 
    AddHandler bgGetAllStock.RunWorkerCompleted, AddressOf BGPopulateStockList 

    '//Begin running of the loading code in the background whilst the form remains open to use. 
    bgGetAllOpenOrders.RunWorkerAsync() 

BGPopulateAllOpenOrders里面我打电话bgAllNeedsAttention.RunWorkerAsync()BGPopulateNeedsAttentionList我打电话bgGetAllStock.RunWorkerAsync()。这个(我认为)有一个同步的味道,但它的工作原理和这个和旧方法之间的时差是微不足道的,再加上它总是返回到正确的数据,并没有抛出任何错误。

我想知道的是,这是一种反模式/不推荐,它可以导致任何问题,我只是没有看到?

+1

你有没有考虑过使用[Task](http://msdn.microsoft.com/en-us/library/system.threading.tasks.task(v = vs.110).aspx)类来做到这一点?它支持“链接”动作,如'task1.ContinueWith(task2)'。 –

+0

这不是我意识到的类。感谢您的信息,我会看看。 – BenM

回答

1

它会工作,它不会“导致任何问题”。

另一方面,它不是一个很好的模式,即难以维护。

考虑1个Bgw,它只是按顺序运行3个方法。我依赖于什么数据返回,以及何时/如何使用它。但是,您可以轻松使用Control.Invoke(Dispatcher.Invoke)返回主线程,Completed事件只是为您完成。