Полный пример того, как этого добиться ...
using System
using Core.Services;
using System.Threading.Tasks;
using System.Web.Hosting;
public interface IISHostedProcessService : IRegisteredObject, IDisposable
{
Task Start();
}
public class CoreHostedProcess : IISHostedProcessService
{
protected bool running;
public CoreHostedProcess()
{
}
public virtual Task Start()
{
return Task.Run(() =>
{
running = true;
HostingEnvironment.RegisterObject(this);
});
}
public virtual void Stop(bool immediate)
{
running = false;
HostingEnvironment.UnregisterObject(this);
}
public virtual void Dispose()
{
}
}
Хорошо, что это основной материал определен, теперь мы определим размещаемой процесс, чтобы сделать что-то полезное, как гм, запускать задачи по расписанию ...
using log4net;
using System.Threading.Tasks;
using System.Timers;
using System;
using Core.Utilities.Objects.Entities;
using System.Linq;
using System.Net.Http;
using Core.Objects;
using Ninject;
public class TaskScheduler : CoreHostedProcess
{
static readonly ILog log = LogManager.GetLogger(typeof(TaskScheduler));
Timer timer = new Timer(60000);
IKernel kernel;
public TaskScheduler(IKernel kernel) : base()
{
this.kernel = kernel;
}
async void RunTasks(object sender, ElapsedEventArgs e)
{
//TODO: write code to fetch tasks and run them
}
public override async Task Start()
{
log.Info(" Initialising Task Scheduler.");
timer.Elapsed += RunTasks;
RunTasks(null, null);
timer.Start();
await base.Start();
}
public override void Stop(bool immediate)
{
log.Info(" Stopping Task Scheduler.");
timer.Stop();
base.Stop(immediate);
}
}
Хорошо, теперь использовать размещенный процесс ...
в IIS, в приложениях расширенные настройки набор «преднагрузки поддержкой» истинно, чтобы обеспечить приложение постоянно находится на сервере аф начальная нагрузка.
Когда приложение нагрузки, например, если с помощью Owin/в старой школе глобального файла asax вы можете добавить следующее ...
public class Startup
{
static readonly ILog log = LogManager.GetLogger(typeof(Startup));
public static IKernel Kernel { get; private set; }
static List<IISHostedProcessService> hostedProcesses = new List<IISHostedProcessService>();
public void Configuration(IAppBuilder app)
{
hostedProcesses.Add(new TaskScheduler());
}
}
Теперь вы должны иметь все, что нужно как определить и инициализировать TaskScheduler изнутри размещенного в IIS приложения C# я создал API для управления данными задачи с использованием OData, который находится поверх моего управляемого EF db, чтобы я мог CRUD управлять набором задач в системе.
После развертывания я считаю, что мне нужно ударить приложение хотя бы один раз, просто сделав запрос на него (любой URL-адрес), после загрузки IIS продолжит работу (таким образом, ваш хостинг-процесс будет запущен) до тех пор, пока вы не остановите приложение IIS который размещает этот процесс.
Когда приложение остановлено, на ваши размещенные процессы вызывается метод Stop, который «отменяет регистрацию хост-процесса» и удаляет его на сервере, тем самым связывая хостинг-процесс с жизненным циклом приложений IIS.
Я подумал, что слишком много для публикации кода OData и EF. Надеюсь, это должно сделать.