我有一个带有 async
方法的类:
public static async Task GetData() { ... }
在我使用的应用程序框架中,我需要启动该进程并在应用程序启动时忘记它:
protected override void OnStart()
{
await MyService.GetData();
}
我无法使 OnStart
async.
如何在后台任务中启动它并忘记它?
最佳答案
I can't make OnStart Async. How do I start it in a background task and forget about it?
为什么不呢?没有什么能阻止你让它成为async
。 async
修饰符不影响 CLR 方法签名,即您可以覆盖 void
方法并使其成为 async
:
abstract class AppBase
{
protected abstract void OnStart();
}
class App: AppBase
{
public static async Task GetData() { await Task.Delay(1); }
protected override async void OnStart()
{
await GetData();
}
}
这样,如果 GetData
抛出,至少您会看到异常,这与其他答案所建议的不同。
确保您了解async void
方法和Task
错误处理的一般工作方式,this material可能会有帮助。
Task.Run( () => MyService.GetData() )
的一些其他问题:
因为
GetData
是已经异步的,所以用Task.Run
包装它几乎没有意义。它通常仅在客户端 UI 应用程序中完成,并且仅当GetData
具有长时间运行的同步部分时(在它到达第一个await
之前)。否则,您也可以在不使用Task.Run
和不使用await
的情况下调用GetData()
(这也是一个坏主意:无论是在这种情况下,您会在没有观察到可能的异常的情况下执行即发即弃调用。Task.Run
将在没有同步内容的随机池线程上启动GetData
,这可能是 UI 应用程序或 ASP.NET 的问题应用。
关于c# - 在后台运行任务 (PCL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28257772/