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



我对异步等待概念有点陌生。在存储库中具有以下方法

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 是不受欢迎的;所以除非ContextFindAsync的方法,否则我只会:

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

最新更新