我是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;
请对此事说清楚。对此,我真的非常感激! 干杯! 谢谢!
答案 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是不受欢迎的;所以除非Context
有FindAsync
方法,否则我只会:
Task<int> unitTask = Task.Run(() => unitOfWork.Complete(whateverArgs));
await unitTask;