r3plica
r3plica

Reputation: 13367

Get result from async method

I have this method in my service:

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

and then in a view I have this code:

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

but the user is the Task and not the User. I tried adding await to the service call, but I can't use await unless the current method is async. How can I access the User class?

Upvotes: 17

Views: 68827

Answers (2)

Stephen Cleary
Stephen Cleary

Reputation: 456607

The best solution is to make the calling method async and then use await, as Bas Brekelmans pointed out.

When you make a method async, you should change the return type (if it is void, change it to Task; otherwise, change it from T to Task<T>) and add an Async suffix to the method name. If the return type cannot be Task because it's an event handler, then you can use async void instead.

If the calling method is a constructor, you can use one of these techniques from my blog. It the calling method is a property getter, you can use one of these techniques from my blog.

Upvotes: 15

Illia Tereshchuk
Illia Tereshchuk

Reputation: 1202

  • Using this in async methods without special thread-locked object is dangerous
  • If you cannot use await, use a code like following.

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

Upvotes: 13

Related Questions