WCF 中的非等待任务会怎样?

What happens to non-awaited tasks in WCF?

假设您有这个控制台应用程序:

    static void Main(string[] args)
    {
        var httpClient = new HttpClient()
            { BaseAddress = new Uri("http://www.timesofmalta.com") };

        var responseTask = httpClient.GetAsync("/");
    }

由于没有等待任务,程序到达终点,发现没有其他前台线程在执行,并在收到任何响应之前退出。这很清楚,因为这是一个控制台应用程序。

现在假设您有一个 WCF 应用程序,其中的请求同样会导致任务生成,但不会等待它。假设此任务很长 运行,并且是即发即弃,而不是像 HTTP GET 这样的任务。

在这种情况下,该任务会怎样?线程是否像在控制台应用程序中那样死掉,从而导致任务中断?这会导致任务中稍后出现的代码无法执行吗?

这取决于您的 WCF 的托管方式。每当应用程序退出时,它的线程将被拆除,任何未完成的异步操作都将被删除。

请注意,如果 WCF 托管在 ASP.NET 中,那么即发即弃是危险的; ASP.NET 会定期回收您的应用程序以保持内容清洁,届时您的即发即弃操作可能会消失。 ASP.NET 提供 API 来注册这样的工作(如果您绝对必须在进程中进行)。

如果您 运行 在另一台主机上,则必须使用任何可用的技术在该主机上注册。

或者,您可以引入一个适当的分布式架构:WCF 端点只是将要完成的工作的描述序列化到一个可靠的队列(Azure 队列/MSMQ/WebSphereMQ 等),以及一个独立的后台工作进程工作(Azure 网络作业/Azure 工作者角色/Win32 服务等)。这是一个更复杂的设置,但修复了如果您尝试让 WCF 应用程序在进程中完成所有操作时可能遇到的 "lost work" 问题。