2014-11-03 99 views
-1

我正在這樣做。它的工作,但這是一個推薦的方式來做到這一點。請評論如何實現異步任務使用異步從數據庫中獲取數據並等待?

public async void LoadData() 
{ 
    DataTable dtAdditionsDetails = await LoadReportData(importID, 
              InkeyCommon.ToInt32(cmbSellers.SelectedValue), 
              fromDate, 
              toDate); 
    if (dtAdditionsDetails != null) 
     dtaGrdAdditions.ItemSource = dtAdditionsDetails.DefaultView; 
} 

public async Task<DataTable> LoadReportData(int? importID, 
             int sellerID, 
             DateTime? fromDate, 
             DateTime? toDate) 
{ 
    DataTable dtAdditionsDetails = new DataTable(); 

    //Get Report Data            
    await Task.Delay(1); 

    dtAdditionsDetails = ReportsData.GetRptAdditions(importID, 
            sellerID, 
            fromDate, 
            toDate); 

    return dtAdditionsDetails; 
} 
+1

如果實際獲取數據的方法(GetRptAdditions)實際上是同步的,爲什麼要實現異步/等待模式?這沒有多大意義。 – ken2k 2014-11-03 13:46:56

回答

0

爲了使用await關鍵字正常,正在「期待已久」的對象應該真正是...Async方法,像GetStringAsync方法。正如@ ken2k已經正確指出的那樣,你不能只用await任何方法。因此,回答你的問題這是一個推薦的方式來做到這一點?,答案是否定的。

您可以瞭解如何正確使用awaitasync關鍵字在Asynchronous Programming with Async and Await (C# and Visual Basic)頁面上MSDN,但是,如果你只是想異步運行同步方法,那麼你可以做的是這樣的:

public DataTable LoadData() 
{ 
    DataTable dtAdditionsDetails = ... 
    // Get your data here synchronously 
    return dtAdditionsDetails; 
} 

public async Task<DataTable> LoadDataAsync() 
{ 
    DataTable dtAdditionsDetails = LoadData(); 
    return Task.Run(() => LoadData()); 
} 

...

public async void GetDataAsynchronously() 
{ 
    DataTable dtAdditionsDetails = await LoadDataAsync(); 
} 

注意...Async方法(通常情況下)返回Task<T>對象,而不是什麼,他們的名以字Async。另外請注意,只有數據是從...Async方法和不是Task<T>而我們await當沒有什麼可以await返回。

+0

我正在使用await Task.Delay(1)。這是一個正確的方式來實現這一點? – 2014-11-04 04:10:53

+0

'Task.Delay'與此無關,所以不,這不適合在這裏使用。 – Sheridan 2014-11-04 08:47:14