WCF中未等待的任务会发生什么

本文关键字:什么 任务 等待 WCF | 更新日期: 2024-10-20 03:45:03

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

    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的托管方式。每当应用程序退出时,它的线程就会被拆除,任何未完成的异步操作都会被丢弃。

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

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

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