异步等待问题带有参数的方法

时间:2017-08-04 00:22:28

标签: c#

我是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;

请对此事说清楚。对此,我真的非常感激! 干杯! 谢谢!

3 个答案:

答案 0 :(得分:3)

使用Task.Run

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

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

答案 1 :(得分: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);

答案 2 :(得分:1)

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

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