【问题标题】:How to implement Async Task to fetch data from database using async and await?如何实现异步任务以使用异步和等待从数据库中获取数据?
【发布时间】:2018-06-08 20:41:30
【问题描述】:

我正在这样做。它正在工作,但这是推荐的方法。请收下

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;
}

【问题讨论】:

  • 如果获取数据的实际方法 (GetRptAdditions) 实际上是同步的,为什么还要实现异步/等待模式?这没有多大意义。

标签: c# wpf multithreading asynchronous async-await


【解决方案1】:

为了正确使用await 关键字,被“等待”的对象实际上应该是...Async 方法,就像GetStringAsync 方法一样。正如@ken2k 正确指出的那样,您不能只使用await 任何方法。因此,要回答您的问题这是推荐的方法吗?,答案是否定的。

您可以在 MSDN 上的 Asynchronous Programming with Async and Await (C# and Visual Basic) 页面中了解如何正确使用 awaitasync 关键字,但是,如果您只是尝试异步运行同步方法,那么您可以这样做这个:

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&lt;T&gt; 对象,而不是什么都没有,并且它们的名称以单词Async 结尾。另请注意,只有数据从 ...Async 方法返回, Task&lt;T&gt; 并且我们 await await 没有任何内容时.

【讨论】:

  • 我正在使用 await Task.Delay(1)。这是实现这一点的正确方法吗?
  • Task.Delay 与此无关,所以不,这里不适合使用。
  • 我尝试使用此代码,但似乎无效...
【解决方案2】:

这是一个简单的函数,使用asyncawait 从数据库中加载所有[User] 记录的列表。

[HttpGet]
public async Task<IActionResult> Get()
{
    try
    {
        //  Fetch a list of all the [User] records, just for the hell of it.
        var users = await Task.Run(() => dbContextWebMgt.Users.ToList());
        return new OkObjectResult(users);
    }
    catch (Exception ex)
    {
        return new BadRequestObjectResult(ex.Message);
    }
}

【讨论】:

    【解决方案3】:

    您可以使用 NPoco ORM 尝试这样的操作

    [HttpGet]
    public async Task<IActionResult> GetAsync()
    
    {
          IList myList = await FetchAsync();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 2019-10-02
      • 2013-02-10
      • 1970-01-01
      • 2019-07-29
      • 2021-10-06
      相关资源
      最近更新 更多