2017-09-29 42 views
-4

我有一個需要10-15秒才能加載的UI。所以實現後臺線程(BG Thread)來加載數據。 當BG線程獲取數據時,主線程開始執行代碼的其餘部分,這就是問題開始的地方。主線程嘗試訪問尚未填充的數據後臺線程

當步驟如下1,由BG只主題...主線程試圖執行步驟2

如何確保直到我從後臺線程記錄(步驟1),第2步是執行沒有執行?

所以,這裏是得到執行步驟..

===========This piece is executed only by BG Thread=============================================== 
Step 1. Get data from DB 
    new Thread(() => 
    { 
    Thread.CurrentThread.IsBackground = true; 
    My DB call goes here... and populates productCollection used in step 2 below 
    }).Start(); 

========================================================== 

Step 2. 
if(productCollection?.Count > 0) // This collection is always 0 becuase BG Thread (step 1) has not yet populated the collection and user get "No record message" 
{ 

    // Filter collection based on some criteria 
    // assign the filtered collection to datagrid 
    dgProducts.DataSource = productCollection;  
} 
else 
{ 
// show message to user that "No records found for given criteria"; 
} 
+3

爲什麼不使用'async' /'await'? – johnnyRose

+0

在異步/等待的情況下,加載數據的時間相同,但沒有變化。我曾嘗試使用下面的示例異步/等待。 http://www.c-sharpcorner.com/article/async-and-await-in-c-sharp/ – Amit

+0

這就是異步/等待的整點。除非可以同時進行多個調用,否則最終會等待相同的時間(_especially_如果它現在需要15秒!),但使用異步意味着編譯器會爲您管理它。所以你不必擔心強行創建新線程。但真正的價值在於知道數據何時完成加載,就像您的問題所要求的一樣; 「等待」爲你做。 – johnnyRose

回答

0

你應該能夠與任務做這樣的。

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     SetDataSource(); 
    } 

    public async void SetDataSource() 
    { 
     dgProducts.DataSource = await Task.Run(() => 
     { 
      //My DB call goes here... and populates productCollection used in step 2 below 
      return productCollection; 
     }); 
    } 
} 

另一方面,如果你錯了,查詢只需要10-15秒,這不會幫助你。那麼你應該研究如何加快數據庫內的數據庫調用。