没有等待或返回的C#异步任务方法

时间:2017-11-08 18:55:43

标签: c# async-await task

我有一个接口I,它在两个地方实现,如:

interface I 
{ 
   Task DoSomething();
}

接口具有异步Task DoSomething方法API,然后在A类中实现,如:

class A : I {....}

class B : I {....}

在A类中,DoSomething的实现如下所示,没关系:

public async Task DoSomething()
{
    if (...)
    {
        await DoIt();
    }
}

但是,在B类中,DoSomething()的实现不应该做任何事情。  所以,它的实现看起来像这样:

public async Task DoSomething()
{
    // nothing
}

这编译但我不确定除了方法没用之外,做这样的事情是多么正确。

但在这种情况下“无用”在这种情况下是可以的,因为它的实现只是因为实现接口I的B类需要它。

我想知道这是否是一种正确的方法来实现一个返回异步任务但没有等待或返回的方法?我知道这个方法很简单,无法同步执行,因为没有调用等待。

更新:此处已经提出了类似的问题,我在询问这一问题之前已经检查了所有这些问题。没有人问我要问的是什么

2 个答案:

答案 0 :(得分:24)

public Task DoSomething()
{
    return Task.CompletedTask;
}

无需async

如果您使用的是旧版本的.NET,请使用以下命令:

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

如果您发现需要返回结果,但仍然不需要await任何内容,请尝试;

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

或者,如果你真的想使用异步(不推荐);

public async Task<Result> DoSomething()
{
    return new Result();
}

答案 1 :(得分:0)

我看到大多数人都喜欢省略async并改用Task.ComletedTask。但是,即使不使用await,异常处理还是有很大的区别

考虑以下示例

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();
}

使用

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

可能会导致意外的行为。

因此,我更喜欢async而不是Task.CompletedTaskTask.FromResult