C# 异步任务的返回值是多少?

C# 异步任务的返回值是多少?,c#,.net,async-await,C#,.net,Async Await,假设我有这个async方法: public async Task Foo(object fooObj) { //do foo's stuff. //maybe set a fooable static global variable //or write some data to fooObj } void Foo() { // Do some actions. ... // No need for a return statement } a

假设我有这个
async
方法:

public async Task Foo(object fooObj)
{
    //do foo's stuff.
    //maybe set a fooable static global variable
    //or write some data to fooObj
}
void Foo()
{
    // Do some actions.
    ...
    // No need for a return statement
}
async Task Foo()
{
    // Do some actions (presumably using await)
    ...
    // No need for a return statement
}
async Task Foo()
{
    if (weDontNeedToDoAnything)
    {
        return; // This is fine
    }
    // Do some actions (presumably using await)
    ...
    // No need for a return statement
}
把它叫做:

public async void FooCaller()
{
    await Foo(new dummyObject)
}
好的,那么:第一个代码块返回一个
任务
,但实际上它并没有返回到任何地方

我可以想象
async
关键字的情况下会出现一些编译器异常,否则需要返回值

但如果是这种情况,返回值是如何初始化的?(好的,我可以自己检查一下)

更重要的是:

使用此模式时是否存在任何陷阱?(例如:访问
fooObj
,延迟执行时间等)

好的,那么:第一个代码块返回一个任务,但实际上它并没有返回到任何地方

的确如此。您可以将其视为类似于
任务
——如果这是有效的话。它用于指示异步方法何时完成

基本上,任何非void异步方法都会包装任务中返回的任何内容。例如:

async Task<string> FooAsync()
{
    // Do some async operations
    return "foo";
}
对于
async任务
方法,同样适用:

public async Task Foo(object fooObj)
{
    //do foo's stuff.
    //maybe set a fooable static global variable
    //or write some data to fooObj
}
void Foo()
{
    // Do some actions.
    ...
    // No need for a return statement
}
async Task Foo()
{
    // Do some actions (presumably using await)
    ...
    // No need for a return statement
}
async Task Foo()
{
    if (weDontNeedToDoAnything)
    {
        return; // This is fine
    }
    // Do some actions (presumably using await)
    ...
    // No need for a return statement
}
您可以在
异步任务
方法中使用
return
语句(无值):

public async Task Foo(object fooObj)
{
    //do foo's stuff.
    //maybe set a fooable static global variable
    //or write some data to fooObj
}
void Foo()
{
    // Do some actions.
    ...
    // No need for a return statement
}
async Task Foo()
{
    // Do some actions (presumably using await)
    ...
    // No need for a return statement
}
async Task Foo()
{
    if (weDontNeedToDoAnything)
    {
        return; // This is fine
    }
    // Do some actions (presumably using await)
    ...
    // No need for a return statement
}