Ну, я наконец-то внедрил систему для выполнения задач / заданий во внешнем процессе.
Если кто-то хочет знать, как я это реализовал, вот некоторые подробности.Возможно, я напишу статью, чтобы поделиться решением и исходным кодом.
По сути, у нас есть два компонента: Web.dll
(приложение ASP.NET) и программа под названием TaskExecutor.exe
* 1008.* В
Web.dll
есть планировщик действий, который может регистрировать задачи по имени: например:
ActivityScheduler.Get().RegisterActivity("GenerateSearchIndexes", 4 * 1000 * 60 * 60); //each 2 hours
Планировщик действий выполняет каждое действие в потоке, и этот поток вызывает внешний процесс,ActivityExecutor.exe
Эта сборка имеет ссылку на Web.dll
, в котором есть статический 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)
, так же как и в программе.