Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF中未等待的任务会发生什么情况?_C#_Multithreading_Wcf_Asynchronous_Task - Fatal编程技术网

C# WCF中未等待的任务会发生什么情况?

C# WCF中未等待的任务会发生什么情况?,c#,multithreading,wcf,asynchronous,task,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("/"); } 由于任务未被等待,程序将到达其结尾,没有

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

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

        var responseTask = httpClient.GetAsync("/");
    }
由于任务未被等待,程序将到达其结尾,没有发现其他正在执行的前台线程,并在收到任何响应之前退出。这很清楚,因为这是一个控制台应用程序

现在让我们假设您有一个WCF应用程序,其中一个请求类似地导致生成一个任务,但不等待它。假设这个任务是长期运行的,是fire-and-forget,而不是httpget


在这种情况下,该任务会发生什么变化?线程是否像在控制台应用程序中一样消亡,导致任务随之停止?这是否会导致任务中稍后出现的代码无法执行?

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

请注意,如果WCF托管在ASP.NET中,那么fire and forget是危险的;ASP.NET会定期回收你的应用程序,以保持程序的整洁,届时你的fire and forget操作可能会消失。ASP.NET提供API来注册这样的工作(如果您必须在过程中完成)

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


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

谢谢您的回答。除了当应用程序退出时,对于请求的生存期,这是如何工作的?比如,仅仅因为请求中的同步代码已经完成,线程已经被释放,就不能完成fire and forget吗?@Gigi:不,只要应用程序域存在,异步工作就会继续。