2014-02-14 140 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事件只是爲您完成。