对于一个程序来说returns Task是什么意思return什么都没有?
For a procedure that returns Task what does it mean to return nothing?
考虑声明为 return 任务对象的方法 Foo()
public async Task Foo()
{
try
{
// some preliminary code that can throw exceptions
}
catch (Exception e)
{
// do something about the error but we do not want
// to propogate it up.
return;
}
await SomeOtherMethodThatReturnsTask();
}
C# 编译器根本不会抱怨裸体 "return",即使它不是 returning 一个 "Task" 对象。为什么这是允许的?下面发生了什么? C# 是否在此处为 return 制作了一个 Task 对象?
方法签名上的 async
关键字将方法的编译更改为一种状态机,使其成为 return 一个 Task
,当您的方法代码完成时完成。仅存在该关键字就意味着您的方法代码被翻译成更复杂的编译代码。
如果您完全熟悉 yield return
关键字,则原理类似。
是的,对于 async
方法编译器自动生成 Task
结果。无法通过 async
方法手动 return Task
。
请注意,在您的示例中,如果 "preliminary code" 没有 await
,您不需要标记方法 async
并且可以 return 自己完成任务:
public Task Foo()
{
// some synchronous code (no await)
...
if (someCondition)
{
return Task.FromResult(0);
}
return SomeOtherMethodThatReturnsTask();
}
如果在方法 completed.That 时没有返回有意义的值,则使用任务,调用方法 returns 是一个任务,但是当任务完成时,任何正在等待的 await 表达式任务评估为无效。
考虑声明为 return 任务对象的方法 Foo()
public async Task Foo()
{
try
{
// some preliminary code that can throw exceptions
}
catch (Exception e)
{
// do something about the error but we do not want
// to propogate it up.
return;
}
await SomeOtherMethodThatReturnsTask();
}
C# 编译器根本不会抱怨裸体 "return",即使它不是 returning 一个 "Task" 对象。为什么这是允许的?下面发生了什么? C# 是否在此处为 return 制作了一个 Task 对象?
方法签名上的 async
关键字将方法的编译更改为一种状态机,使其成为 return 一个 Task
,当您的方法代码完成时完成。仅存在该关键字就意味着您的方法代码被翻译成更复杂的编译代码。
如果您完全熟悉 yield return
关键字,则原理类似。
是的,对于 async
方法编译器自动生成 Task
结果。无法通过 async
方法手动 return Task
。
请注意,在您的示例中,如果 "preliminary code" 没有 await
,您不需要标记方法 async
并且可以 return 自己完成任务:
public Task Foo()
{
// some synchronous code (no await)
...
if (someCondition)
{
return Task.FromResult(0);
}
return SomeOtherMethodThatReturnsTask();
}
如果在方法 completed.That 时没有返回有意义的值,则使用任务,调用方法 returns 是一个任务,但是当任务完成时,任何正在等待的 await 表达式任务评估为无效。