c# - 在后台运行任务 (PCL)

标签 c# .net task-parallel-library async-await task

我有一个带有 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?

为什么不呢?没有什么能阻止你让它成为asyncasync 修饰符不影响 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/

相关文章:

c# - 将 func<type, bool> 作为参数传递给异步方法时出错

c# - 从任务中调用 Messagebox.Show

c# - 缺乏初始化 View 模型的知识

c# - 为什么不允许指向泛型类型的指针?

.net - 过滤 LoadWith 结果

c# - 在哪里放置txt文件

c# - 用于具有复杂后台计算的响应式 GUI 的多线程 C# - 异步/等待、TPL 或两者?

c# - 什么是NullReferenceException,如何解决?

c# - 在单独的帮助程序类中访问 Controller 外部的 HttpContext session 的最佳实践

c# - 如何在 .NET 中获取打印机信息?