J. *_*aga 0 c# out task async-await
我有一个我正在调用的方法,我想确保它在继续之前完成.我也有兴趣知道它是否成功完成,所以我正在做以下事情:
async void Foo() {
bool success;
// stuff
await Task.Run(
() => Bar(out success)
);
if (!success) { // this is the line causing the compiler-error
// handle
}
// other stuff
}
void Bar(out bool success);
Run Code Online (Sandbox Code Playgroud)
但是我收到了错误
CS0165使用未分配的局部变量'success'
这不是一个大问题,因为我可以变得可爱并初始化success=false
并传递它,ref
而不是out
看起来像希望的那样.但是,我很好奇async-await
(或Task.Run
)的复杂性似乎会导致一个不保证的情况out success
会被正确分配.
任何启示都表示赞赏!
编辑:
要添加更多上下文,以下块编译并执行正常.
void Caller() {
bool success;
Callee(out success);
if (success) {
// do something
}
}
void Callee();
Run Code Online (Sandbox Code Playgroud)
这是因为out
参数在传递之前不需要初始化.有关更多信息,请访问out
:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/out-parameter-modifier
考虑以下可能(尽管完全不正确)的实现Task.Run
:
public class Task
{
public static Task Run(Action action)
{
return Task.Delay(500);
}
//...
}
Run Code Online (Sandbox Code Playgroud)
现在想想有问题的代码.有了这个实现Task.Run
,这个Bar
方法会被调用吗?success
不会.因此永远不会被初始化,并且尝试访问未初始化的变量.
编译器不知道Task.Run
它的实际实现或它将做什么.它不能假设它没有像我上面那样实现,因此可以使用未初始化的变量.