从异步方法获取结果

r3p*_*ica 11 c# asynchronous entity-framework

我的服务中有这个方法:

public virtual async Task<User> FindByIdAsync(string userId)
{
    this.ThrowIfDisposed();
    if (userId == null)
    {
        throw new ArgumentNullException("userId");
    }
    return await this.repository.FindByIdAsync(userId);
}
Run Code Online (Sandbox Code Playgroud)

然后在视图中我有这个代码:

using (var service = new UserService(new CompanyService(), User.Identity.GetUserId()))
{
    var user = service.FindByIdAsync(id);
}
Run Code Online (Sandbox Code Playgroud)

但用户是任务而不是用户.我尝试添加等待服务调用,但除非当前方法是异步,否则我不能使用await.如何访问User类?

Ste*_*ary 12

正如Bas Brekelmans指出的那样,最好的解决方案是制作调用方法async然后使用await.

创建方法时async,应更改返回类型(如果是void,请将其更改为Task;否则,将其更改TTask<T>)并Async为方法名称添加后缀.如果返回类型不能Task因为它是一个事件处理程序,那么你可以使用async void来代替.

如果调用方法是构造函数,您可以从我的博客中使用这些技术之一.调用方法是一个属性getter,你可以从我的博客中使用这些技术之一.

  • 说伙伴......你是.net框架的核心开发者吗?您深入参与了c#中的并发开发 (2认同)

Ily*_*huk 10

  • thisasync没有特殊螺纹锁定对象的方法中使用是危险的
  • 如果您无法使用await,请使用以下代码.

    Task<User> task = TaskFindByIdAsync();
    
    task.Wait(); //Blocks thread and waits until task is completed
    
    User resultUser = task.Result;
    
    Run Code Online (Sandbox Code Playgroud)