C# Async Task Method Without Await or Return

前端 未结 2 351
挽巷
挽巷 2021-01-04 04:51

I have an Interface I that is implemented in two places like:

interface I 
{ 
   Task DoSomething();
}

The interface has async Task DoSomet

相关标签:
2条回答
  • 2021-01-04 05:05
    public Task DoSomething()
    {
        return Task.CompletedTask;
    }
    

    No need for the async.

    If you're using an older version of .NET, use this:

    public Task DoSomething()
    {
        return Task.FromResult(0);
    }
    

    If you find you need to return a result but you still dont need to await anything, try;

    public Task<Result> DoSomething()
    {
        return Task.FromResult(new Result())
    }
    

    or, if you really want to use async (not recommended);

    public async Task<Result> DoSomething()
    {
        return new Result();
    }
    
    0 讨论(0)
  • 2021-01-04 05:22

    I see that most people prefer to leave out the async and use Task.ComletedTask instead. But even if await is not used, there is still a big difference in exception handling

    Consider the following example

    static async Task Main(string[] args)
    {
    
        Task task = test(); // Will throw exception here
        await task;
    
        Task taskAsync = testWithAsync();
        await taskAsync; // Will throw exception here
    }
    
    static Task test()
    {
        throw new Exception();
        return Task.CompletedTask; //Unreachable, but left in for the example
    }
    
    static async Task testWithAsync()
    {
        throw new Exception();
    }
    

    Using

    test().ContinueWith(...); or Task.WhenAll(test())

    may result in unexpected behaviour.

    Therefore, I prefer async instead of Task.CompletedTask or Task.FromResult.

    0 讨论(0)
提交回复
热议问题