如何实现这一点的完整示例...
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 中,在应用程序高级设置中将“preload enabled”设置为 true,以确保应用程序在初始加载后仍保持加载在服务器上。
当应用加载时,例如,如果在旧式全局 asax 文件中使用 owin /,您可以添加以下内容...
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());
}
}
现在您应该拥有从 IIS 托管的 C# 应用程序中定义和初始化 TaskScheduler 所需的一切,我使用位于我的 EF 托管数据库顶部的 OData 构建了一个用于管理任务数据的 API,因此我可以CRUD 管理系统中的任务集。
部署后,我相信我必须通过简单地向应用程序发出请求(任何 url)至少点击一次应用程序,一旦加载 IIS 将保持它运行(从而保持你的托管进程运行),直到你停止 IIS 应用程序托管进程。
当应用程序停止时,将在您的托管进程上调用 Stop 方法,该方法“取消注册托管进程”并将其释放到服务器上,从而将托管进程与 IIS 应用程序生命周期联系起来。
我认为也发布 OData 和 EF 代码有点过分。
希望这应该可以。