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:不,只要应用程序域存在,异步工作就会继续。