Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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# 管理web应用程序中长时间运行的进程的策略?_C#_Asp.net_Sql Server_Wcf_Windows Services - Fatal编程技术网

C# 管理web应用程序中长时间运行的进程的策略?

C# 管理web应用程序中长时间运行的进程的策略?,c#,asp.net,sql-server,wcf,windows-services,C#,Asp.net,Sql Server,Wcf,Windows Services,我正在开发一个web asp.net应用程序。该应用程序的一个特点是,用户能够将大量长时间运行的操作排队,然后点击运行队列进行处理 我不希望用户必须坐着等待所有操作完成,或者确实保持浏览器/应用程序打开。但是,如果他们保留或返回页面,我希望他们能够看到每个作业的状态,即等待、进行中、完成或失败 我很自然地在寻找最健壮、可靠和可扩展的解决方案,因为随时都可能有大量的工作在队列中 根据我的研究,有人建议asp.net可以调用windows服务?它可能正在托管一个WCF web服务 从过去可能有类似需

我正在开发一个web asp.net应用程序。该应用程序的一个特点是,用户能够将大量长时间运行的操作排队,然后点击运行队列进行处理

我不希望用户必须坐着等待所有操作完成,或者确实保持浏览器/应用程序打开。但是,如果他们保留或返回页面,我希望他们能够看到每个作业的状态,即等待、进行中、完成或失败

我很自然地在寻找最健壮、可靠和可扩展的解决方案,因为随时都可能有大量的工作在队列中

根据我的研究,有人建议asp.net可以调用windows服务?它可能正在托管一个WCF web服务


从过去可能有类似需求的任何人那里寻求建议。

通常一个好的方法是使用Windows服务来执行计划的作业。您可以使用像这样的库,它具有各种调度功能。如果不需要特定的调度,您可以让Windows服务充当辅助进程,并简单地使用作业。除此之外,您还需要促进web应用程序和执行排队任务的服务之间的通信。为此,您可以使用多种技术,例如使用数据库中的表或仅使用其他类型的进程间通信技术(远程处理、命名管道、套接字、消息队列等)


实际上,我实现了类似这样的东西,其中有一个Windows服务执行计划的作业,还有一个ASP.NET web应用程序正在提交所有作业请求。ASP.NET应用程序将一些作业发布到数据库中,这些作业稍后将由服务进程使用。

使用windows服务是一个好主意。不过,我没有任何使用它的经验,也不知道意外的陷阱。
此外,您可能还想查看该模式。(可以找到更多信息和样本) 使用多线程可能是另一种选择。有关更多信息,请查看:


还可以查看MSMQ

基本上,web应用程序将“作业”或“作业组”放入队列中

该服务持续运行,将下一个“作业”或“一组作业”排在队列中,并开始与它们打交道

完成后,服务将结果放入另一个队列或web应用程序访问的DB(或其他共享资源)中,并显示其状态或结果


享受。

我也有类似的问题。我有一个web应用程序可以启动一个长时间运行的过程。我想更新用户界面,让用户看到正在发生的事情。我有一个类,它设置了一些属性,然后开始这个过程。这是我的方法

1) 向我的类、作业id添加属性。
2) 当web用户启动作业时,生成一个新的作业id并将其分配给上面的属性。
3) 当我的类运行它的过程时,更新数据库中的日志表。根据作业id进行更新。
4) 在前端,让一些简单的ajax进程每隔x秒检查一次作业id的状态。


就是这样。

看看MSMQ,它看起来确实很优雅,但是在我的场景中,我不确定我是否能看到使用数据库表的好处,并且观察它而不是队列,我是否遗漏了什么?这取决于,在您的场景中,这可能是不必要的,但是如果您的系统需要增长,集成这样的队列可能会证明更可靠和可扩展。为了保持一个体面的“状态消息”,您可能需要一个数据库。我只想提醒你,如果你采用“后台线程”的方式,那么你应该以一种在负载平衡环境下工作的方式来构建它。正如你所说,我并不是严格地试图安排任何事情,但Quartz.NET看起来确实很有趣。理想情况下,我喜欢调用该服务,并在将作业添加到队列后告诉它运行。如果我每隔一分钟左右进行一次民意调查,我想这里面并没有太多内容……是的,您也可以使用MSMQ或简单的套接字向您的服务发出新工作可用的信号。这里有一些关于IPC的更多信息:找到了这篇非常好的文章-。