2014-11-03 78 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