我需要在我的Web中执行一些activities/jobs,例如索引一些信息、组织一些文件和计算一些统计数据.
我希望保留Web中的QoS (性能、内存消耗、.)。因此,我想为这些活动执行一个外部进程,而不是调用一个线程。类似于Apache MPM处理器 (它启动子进程来处理请求)。
谢谢你的进阶。
发布于 2010-11-25 09:33:12
最后,我实现了一个在外部进程中执行任务/作业的系统。
如果有人想知道我是如何实现它的,下面是一些细节。也许我会写一篇文章来分享解决方案和源代码。
基本上,我们有两个组件,Web.dll (ASP.NET应用程序)和一个名为TaskExecutor.exe的程序
在Web.dll中,有一个活动调度程序可以按名称注册任务:例如:
ActivityScheduler.Get().RegisterActivity("GenerateSearchIndexes", 4 * 1000 * 60 * 60); //each 2 hours活动调度程序在线程中执行每个活动,此线程调用外部进程ActivityExecutor.exe。
此程序集引用Web.dll,该ActivityFactory具有获取活动的静态ActivityFactory。外部进程的源代码非常简单:
public static void Main (string[] args)
{
try
{
if (args.Length == 0)
{
throw new ArgumentException("No activity name given", "ActivityName");
}
//parameter 0 is the activity name
string activityName = args[0];
IScheduledActivity activity = ActivityFactory.GetActivity(activityName);
if (activityName != null)
{
activity.Execute(args);
}
}
catch (Exception ex)
{
Console.WriteLine("Error executing activity: " + ex.Message);
}
}您可以猜到这里的限制是活动必须是静态定义的,因此它们不能在其构造函数中接收参数。这些都是在IScheduledActivity.Schedule(string[] args)方法中传递的,就像一个程序所做的那样。
发布于 2010-11-24 08:13:59
您可以查看Quartz.NET,它允许您调度将在服务器上运行的作业。
发布于 2010-11-24 09:33:28
你能做一些像他们在堆栈交换网站上使用的事情吗?
https://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/
https://stackoverflow.com/questions/4264445
复制相似问题