2016-12-15 50 views
0

我有一个事件的对象。例如:后台事件ASP.NET MVC

var myObject = new MyObject(); 
myObject.CustomEvent += _myEvent; 

private void _myEvent(object sender, CustomEvent e) 
{ 
    using (var db = new DbContext()) 
    { 
     db.MyEntity.Add(e.Property); 
     db.SaveChanges(); 
    } 
} 

此事件应该在所有应用程序运行时都处于活动状态。 对于后台任务,我使用Hangfire。但我的事件没有被解雇。也许,根本就没有理由使用Hangfire来解决这个问题。

请帮助,谢谢!

更新

我做的迟发型内启动。

public partial class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     ModelBinders.Binders.Add(typeof(double), new DoubleModelBinder()); 
     ConfigureAuth(app); 

     GlobalConfiguration.Configuration 
     .UseSqlServerStorage("myConString"); 
     BackgroundJob.Enqueue(() => MyEventListener()); 
     app.UseHangfireServer(); 
    } 

    public void MyEventListener() 
    { 
     new MyObject().CustomEvent += delegate (object sender, CustomEvents e) 
     { 
      using (var db = new DbContext()) 
      { 
       db.MyEntity.Add(e.Property); 
       db.SaveChanges(); 
      } 
     } 
    } 
} 
+0

您所显示的代码都不会尝试在HangFire作业中注册事件。 Hangfire会是一个很好的解决方案,让一些东西在后台运行,但是你需要真正使用它。 – krillgar

+0

谢谢。我将编辑我的帖子以使用Hangfire代码显示。 – loqie

回答

1

Hangfire必须序列化您的作业,然后在运行时反序列化它们以调用您排入的逻辑。如果你只是想将一个事件附加到一个对象上,那么你不一定需要使用Hangfire。

在您的示例中,附加事件将毫无意义,因为CustomEvent是一个实例属性,所以您正在创建对象的新实例。您调用MyEventListener时,该实例将超出范围。另外,你所做的只是将一个事件附加到一个新的未使用的MyObject实例上,但从未调用它。

+0

谢谢你的回答!我已经尝试将我的代码放在Global.asax或没有Hangfire的Startup中,但它不起作用。我应该在哪里放置事件对象?我想保持它一直活着。 – loqie

+0

你想要什么时候发生什么?你现在的例子将永远不会触发事件。您正在创建一个对象的实例,将一个事件附加到该对象上,然后它将不再被使用。你可以将事件附加在对象构造函数中,你可以使事件成为一个静态属性,但是如果不理解你想要实现的是什么,我不能说。 – reckface