无需等待或返回的异步方法

问题描述 投票:0回答:2

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

interface I 
{ 
   Task DoSomething();
}

该接口具有异步任务 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 需要它。

我想知道这是否是实现返回异步任务但没有等待或返回的方法的正确方法?我知道这个方法将简单地不执行任何操作并同步执行,因为没有调用await。

更新:这里也有人问过类似的问题,在问这个问题之前我已经检查了所有这些问题。但没有人问我在问什么

c# async-await task
2个回答
65
投票
public Task DoSomething()
{
    return Task.CompletedTask;
}

不需要

async

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

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

如果您发现需要返回结果,但仍然不需要

await
任何东西,请尝试;

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

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

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

11
投票

我发现大多数人更喜欢省略

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.CompletedTask
Task.FromResult

© www.soinside.com 2019 - 2024. All rights reserved.