我有关于后台工作人员的问题/问题。在另一个后台工作人员调用后台工作人员“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()
。这个(我认为)有一个同步的味道,但它的工作原理和这个和旧方法之间的时差是微不足道的,再加上它总是返回到正确的数据,并没有抛出任何错误。
我想知道的是,这是一种反模式/不推荐,它可以导致任何问题,我只是没有看到?
你有没有考虑过使用[Task](http://msdn.microsoft.com/en-us/library/system.threading.tasks.task(v = vs.110).aspx)类来做到这一点?它支持“链接”动作,如'task1.ContinueWith(task2)'。 –
这不是我意识到的类。感谢您的信息,我会看看。 – BenM