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

无等待或返回的C#异步任务方法,c#,async-await,task,C#,Async Await,Task,我有一个接口I,它在两个地方实现,如: interface I { Task DoSomething(); } 该接口具有异步任务DoSomething方法API,然后在类A中实现,如: class A : I {....} class B : I {....} 在A类中,DoSomething的实现如下所示,这是可以的: public async Task DoSomething() { if (...) { await DoIt();

我有一个接口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所需要的

我想知道这是否是实现返回异步任务但没有等待或返回的方法的正确方法?我知道这个方法将不做任何事情,并且同步执行,因为没有等待的调用

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

public Task DoSomething()
{
    return Task.CompletedTask;
}
不需要
异步

如果您使用的是较旧版本的.NET,请使用以下选项:

public Task DoSomething()
{
    return Task.FromResult(0);
}
如果您发现需要返回结果,但仍然不需要等待任何结果,请尝试

public Task<Result> DoSomething()
{
    return Task.FromResult(new Result())
}
公共任务DoSomething()
{
返回Task.FromResult(新结果())
}
或者,如果您真的想使用异步(不推荐)

public异步任务DoSomething()
{
返回新结果();
}

我发现大多数人更喜欢省略
async
而使用
Task.comlettask
。但是,即使未使用
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()。继续使用(…)
Task.whalll(test())

可能导致意外行为


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

如果您计划在方法中使用
wait
(直接)的话,您只会将方法标记为
async
。它返回一个
任务
的事实足以满足接口
async/await
与接口无关。我知道不建议使用第四个选项,但您没有给出原因?@m3z-编译器将生成一条警告,大意是“异步方法缺少await运算符,将同步运行”。不过,更重要的是,编译器将为一个非常简单的方法生成一个完整的
IAsyncStateMachine
。智能编译器可能会对此进行优化,但从对的简短访问来看,似乎很有可能不会,在NET47x上,异步方法的x86程序集JIT为259字节,同步方法为71字节。这很有意义。谢谢
不需要异步
-但是它有什么害处吗?我有点喜欢交易
return Task.com完成任务行,用于
async
关键字,如果它不会以任何方式造成损害。@vegar-正如sellotape所提到的,异步方法有一个与之相关的开销,应该只用于实现I/O密集型的内容(如写入文件、进行外部Http调用)。对于简单方法或“计算密集型”方法(如添加两个数字,计算10^10的阶乘),async没有帮助,因此不需要创建额外的状态开销。
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();
}