我对异步等待概念有点陌生。在存储库中具有以下方法
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
BindingSource.DataSource = await Task.Run(() => unitOfWork.ClientDemos.Get(newClient.ClientId));
您还应该阅读 Async/Await - 异步编程的最佳实践
看起来你可能正在使用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);
一般来说,你不会new
任务对象。你有一个方法返回它们(或使用Task.Run
来生成它们(。以一种或另一种方式强制使用 API 是不受欢迎的;所以除非Context
有FindAsync
的方法,否则我只会:
Task<int> unitTask = Task.Run(() => unitOfWork.Complete(whateverArgs));
await unitTask;