我有關於後臺工作人員的問題/問題。在另一個後臺工作人員調用後臺工作人員「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