在构造函数中调用异步方法?

时间:2018-11-21 05:28:40

标签: c#

我曾经在构造函数中调用异步方法(触发并忘记了?)

 Task.Run(async () => await CallAsync());

我听说最好使用ICommand来执行它。

ICommand MyCmd => new Command(async () => await CallAsync());

public MyClass()
{
     MyCmd.Execute(null);
}

这两种方法有什么区别?

1 个答案:

答案 0 :(得分:2)

您的帖子没有多大意义。

如果您要触发并忘记一个异步方法,那么直接调用它就足够了。

public Task RunAsync() { }

public Constructor()
{
    RunAsync(); // fire-and-forget by not awaiting and ignoring returned task
}

无需使用Task.RunCommand,从技术上讲,该方法在运行该方法之上没有任何作用。

但是这种一劳永逸的代码不受欢迎,因为它使对代码的测试变得困难。在构造函数中启动这样的代码会使对象创建产生意想不到的副作用,这些副作用不会立即显现出来。建议使用某种Initialize方法可以调用。

另一个问题是,如果该方法导致异常,则必须注册一个特殊的处理程序,否则会使整个应用程序崩溃。