gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:34:49 24 4
gpt4 key购买 nike

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

    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 worker 角色/Win32 服务等)。这是一个更复杂的设置,但修复了如果您尝试让 WCF 应用程序在进程中完成所有工作时可能遇到的“丢失的工作”问题。

关于c# - WCF 中的非等待任务会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28888601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com