【问题标题】:Async Await Issue for methods with parameters带有参数的方法的异步等待问题
【发布时间】:2017-08-04 09:10:17
【问题描述】:

我对 Async Await 概念有点陌生。在存储库中有以下方法

    public TEntity Get(int id)
    {
        return Context.Set<TEntity>().Find(id);
    }

我从另一个方法调用这个方法

 BindingSource.DataSource = unitOfWork.ClientDemos.Get(newClient.ClientId);

我想对此进行异步处理,因为这可能需要一段时间,具体取决于服务器速度等。我该怎么做?我疲倦的每一种方式都给我带来了不同类型的错误。我不想用我的错误方法来打扰你们。但这是我尝试过但没有奏效的东西。

Task <IEnumerable<ClientDemographic>> tsk= new Task <IEnumerable<ClientDemographic> >(unitOfWork.ClientDemos.Get(newClient.ClientId));
                tsk.Start();
                BindingSource.DataSource = await tsk;

当没有要传递的参数并且返回类型为 int 时,它会产生奇迹。像下面这样。这个效果很好。

 Task<int> tsk = new Task<int>(unitOfWork.Complete);
                tsk.Start();
                rej = await tsk;

请对此事有所了解。对此,我真的非常感激! 干杯! 谢谢!

【问题讨论】:

  • 使用Task.Run 并花一些时间阅读这个msdn.microsoft.com/en-us/magazine/jj991977.aspx
  • 显示更多来自具有BindingSource.DataSource = unitOfWork.ClientDemos.Get(newClient.ClientId); 的方法的代码,这可以而且应该在没有Task.Runnew Task 的情况下完成,但是为了给你一个很好的例子,我们需要看看这个方法设置该数据绑定。此外,您确实应该检查您在Context.Set&lt;TEntity&gt;().Find(id); 调用中使用的库的文档,很可能会有一个FindAsync(id) 调用,您可以执行并等待,而不是在另一个线程上执行.Find。最后,关于您展示的示例不起作用的地方。

标签: c#


【解决方案1】:

使用Task.Run

BindingSource.DataSource = await Task.Run(() => unitOfWork.ClientDemos.Get(newClient.ClientId));

您还应该阅读Async/Await - Best Practices in Asynchronous Programming

【讨论】:

    【解决方案2】:

    看起来您可能正在使用 EntityFramework,如果是,则有一个 FindAsync 方法。如果是这样的话,使用它会比 Task.Run 更好。

    public async Task<TEntity> GetAsync(int id)
    {
        return await Context.Set<TEntity>().FindAsync(id);
    }
    

    然后:

    BindingSource.DataSource = await unitOfWork.ClientDemos.GetAsync(newClient.ClientId);
    

    【讨论】:

      【解决方案3】:

      一般来说,您不会 new 任务对象。您有一个方法返回它们(或使用Task.Run 生成它们)。不赞成以一种或另一种方式强制 API;所以除非ContextFindAsync 方法,否则我只会:

      Task<int> unitTask = Task.Run(() => unitOfWork.Complete(whateverArgs));
      await unitTask;
      

      【讨论】:

        猜你喜欢
        • 2020-04-20
        • 1970-01-01
        • 2021-10-11
        • 1970-01-01
        • 2018-12-09
        • 1970-01-01
        • 1970-01-01
        • 2022-10-25
        • 2019-03-02
        相关资源
        最近更新 更多