2014-02-20 49 views
0

我試圖運行一些異步的東西。這裏是我的代碼:同步操作使用異步/等待(主要是留在UI線程上)

private async void SearchButton_Click(object sender, EventArgs e) 
    { 
     await Search(); 
    } 

    // Inside search there is no async operation 
    public Task Search() 
    { 
     // search for data in DB 
     // update DataGridView and other elements on UI 

     // How to return null/void/nothing? 
     return ???; 
    } 

它是非法的/不好的做法,等待上同步的方法,如Search()?我知道我可以使用Task.Run(Search)來代替,但是Search()將在另一個線程上執行(不在UI線程上),我必須經常在Search()內部使用Invoke()

我將Search()方法的返回值從'void'更改爲'Task',使其等待,但是我必須返回什麼?

+0

如果您正在進行數據庫操作,您不想停留在UI線程上,因爲它會使UI掛起。在單獨的線程上以正確的方式做到這一點。嘗試從操縱UI的代碼中分離出數據庫代碼爲不同的方法。 – MgSam

+0

好,所以選項2應該是更好的方法,因爲它不會在UI線程上執行? – AlmightyMato

回答

10

在Search()等同步方法中等待是否是非法/不正確的做法?

這是一個非常糟糕的主意,因爲你的用戶界面基本上會掛起。

您應該將Search方法更改爲SearchAsync(爲了約定),並使用異步數據庫操作使其正確異步。

目前,您沒有任何真正的異步:一切都會發生在您的UI線程上。

+1

+1。 EF6和更高版本支持異步數據庫查詢。 –

+0

我使用EF5因此我不能使用異步查詢?那麼在這種情況下何時/如何接收我的數據?是否有可能開始異步鏈方法,最後我做了一些同步? – AlmightyMato

+1

@AlmightyMato:你可以使用'Task.Run'在不同的線程中啓動數據庫查詢,並在UI線程中「等待」該任務。 –