如果没有更多信息,很难回答这个问题,但我认为您误解了Task.Run() 和异步代码的使用。如果它是不重要的工作,并且您不关心结果或完成,您可能会问是否需要首先在此处运行它。其次,Task.Run() 通常用于执行长时间运行的代码,否则可能会阻塞 UI 线程。如果您正在进行数据库调用或写入文件系统,则将此逻辑放入任务中可能是有意义的。一个例子是
void ReallyImportantFunction()
{
try
{
//Do really important work
Task.Run(() => NotSoImportantWork("some data"));
//Do really important work
}
catch (Exception ex)
{
/ Handle the exception
}
}
void NotSoImportantWork(string data)
{
//Do something here with the data
}
但是,如果您确实曾经使用您正在计算的任何东西,或者您的计算曾经有任何副作用或突变,这会使您面临数据竞争。如果你说的是真的而且你从来没有看结果,我可能会问为什么它在开始的方法中。如果您永远不会使用它们,为什么要在重要的事情中间计算真正不重要的事情呢?如果您正在使用结果,或者改变您需要的东西,那么您的代码正确地等待结果是有意义的。
async void ReallyImportantFunction()
{
try
{
//Do really important work
var myResult = await IOIntensiveWork("some data");
//Do really important work
}
catch (Exception ex)
{
// Handle the exception
}
}
Task<MyResult> IOIntensiveWork(string data)
{
//Do something here with the data
}
如果您也可以避免使用async void 方法,它通常会更干净,尽管它不一定有问题。请记住始终检查异常情况。
编辑:根据您在 cmets 中所写的内容,我认为将您的 NotSoImportantWork() 包装在一个任务中是有意义的。这并不是因为它不重要,而是因为您显然是在进行网络调用,并且在与您无法控制的服务通信时可能会出现各种问题。
因此,您可以只使用ReallyImportantFunction() 中的Task.Run(() => NotSoImportantWork("..."));,但请注意捕获异常的位置以及如果发生异常,您的代码可能会退出的位置。我可能更愿意在那里而不是在NotSoImportantWork() 中启动Task.Run(),因为您可能会使用Task.Run(...).ConfigureAwait(false); 从代码中挤出最后一点性能(这在很大程度上取决于代码的结构)。
根据您从何处启动任务,您可以使用...ConfigureAwait(false); 表示您不需要任务在操作完成后返回到当前上下文。这有时可以提高性能。在有意义的时候尝试并使用它。欲了解更多信息,请查看:When correctly use Task.Run and when just async-await
如果您的代码没有更多的上下文,很难比这更详细。希望对您有所帮助!