提问者:小点点

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


我有一个接口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或Return的方法的正确方法?我知道这个方法将简单地不做任何事情并同步执行,因为没有等待的调用。

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


共2个答案

匿名用户

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

不需要

null

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

如果您发现需要返回一个结果,但仍然不需要任何内容,那么尝试;

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

或者,如果您确实想使用异步(不推荐);

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

匿名用户

我看到大多数人倾向于省略而使用。但是即使不使用,在异常处理方面仍然存在很大差异

请考虑以下示例

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

使用

可能导致意想不到的行为。

因此,我更喜欢,而不是

相关问题