2017-08-04 61 views
2

我有点新异步等待概念。有以下方法库中存储的异步等待问题的方法与参数

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; 

请说明一下这件事情。对此,我真的非常感激! 干杯! 谢谢!

+1

使用'Task.Run'还需要一些时间来对这个https://msdn.microsoft.com/en-us/magazine/jj991977.aspx读了 – Nkosi

+1

从具有'BindingSource.DataSource = unitOfWork.ClientDemos.Get(newClient.ClientId);'的方法中显示更多代码,'这可以并且应该在没有'Task.Run'或'new Task'的情况下完成,但是要给你一个很好的例子,我们需要看看设置数据绑定的方法。此外,你真的应该检查你在'Context.Set ().Find(id);'调用的库的文档,''调用可能会有一个'FindAsync(id)'调用你可以做,并等待而不是在另一个线程上执行'.Find'。最后,对你所展示的例子没有任何效果没有奏效。 –

回答

1

一般而言,您不需要new任务对象。你有一个方法返回它们(或使用Task.Run来生成它们)。强迫API以某种方式被压制;所以除非ContextFindAsync方法我只想:

Task<int> unitTask = Task.Run(() => unitOfWork.Complete(whateverArgs)); 
await unitTask; 
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);