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

时间:2015-03-05 22:00:46

标签: c# multithreading wcf asynchronous task

让我们说你有这个控制台应用程序:

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

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

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

现在让我们假设您有一个WCF应用程序,其中请求同样会导致生成任务,但不会等待它。让我们说这个任务是长期运行的,而且不会像HTTP GET那样发生任何事情。

在这种情况下,该任务会发生什么?线程是否像在控制台应用程序中一样死掉,用它来完成任务?这会导致以后在任务中发生的代码无法执行吗?

1 个答案:

答案 0 :(得分:3)

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

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

如果您在其他主机上运行,​​则必须使用任何可用的技术来注册该主机。

或者,您可以引入适当的分布式体系结构:WCF端点仅将要完成的工作的描述序列化为可靠的队列(Azure队列/ MSMQ / WebSphereMQ /等),以及独立的后台工作进程( Azure webjob / Azure辅助角色/ Win32服务/等)。这是一个更复杂的设置,但修复了失去的工作"如果您尝试让WCF应用程序在进程中执行此操作,则可以获得此问题。