3

Я использую Quartz.NET в этом контексте (необходимо отметить, что GrabberContext является DbContext расширенным классом):Запуска метода асинхронного как работа Quartz.NET и захороненного выпуск объекта

// configuring Autofac: 
var builder = new ContainerBuilder(); 

// configuring GrabberContext 
builder.RegisterType<GrabberContext>() 
    .AsSelf() 
    .InstancePerLifetimeScope(); 

// configuring GrabService 
builder.RegisterType<GrabService>() 
    .AsImplementedInterfaces() 
    .InstancePerLifetimeScope(); 

// configuring Quartz to use Autofac 
builder.RegisterModule(new QuartzAutofacFactoryModule()); 
builder.RegisterModule(new QuartzAutofacJobsModule(typeof(DiConfig).Assembly)); 

var container = builder.Build(); 

// configuring jobs: 
var scheduler = container.Resolve<IScheduler>(); 
scheduler.Start(); 
var jobDetail = new JobDetailImpl("GrabJob", null, typeof(GrabJob)); 
var trigger = TriggerBuilder.Create() 
    .WithIdentity("GrabJobTrigger") 
    .WithSimpleSchedule(x => x 
     .RepeatForever() 
     .WithIntervalInMinutes(1) 
    ) 
    .StartAt(DateTimeOffset.UtcNow.AddSeconds(30)) 
    .Build(); 
    scheduler.ScheduleJob(jobDetail, trigger); 

и это работа:

public class GrabJob : IJob { 

    private readonly IGrabService _grabService; 

    public GrabJob(IGrabService grabService) { _grabService = grabService; } 

    public void Execute(IJobExecutionContext context) { 
     _grabService.CrawlNextAsync(""); 
    } 

} 

GrabService реализации что-то вроде этого:

public class GrabService : IGrabService { 

    private readonly GrabberContext _context; 

    public GrabService(GrabberContext context) { 
     _context = context; 
    } 

    public async Task CrawlNextAsync(string group) { 
     try { 
      var feed = await _context.MyEntities.FindAsync(someId); // line #1 
      // at the line above, I'm getting the mentioned error... 
     } catch(Exception ex) { 
      Trace.WriteLine(ex.Message); 
     } 
    } 
} 

Но когда исполнение получает line #1 я получаю эту ошибку:

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

Любая идея пожалуйста?

+0

где вы установили строку подключения? – Sampath

+0

Можете ли вы показать регистрацию AutoFac для IGrabService? – stuartd

+0

@stuartd см. Обновление, пожалуйста, –

ответ

3

Вы вызываете метод асинхронизации CrawlNextAsync() по методу синхронизации Execute(). Как только как CrawlNextAsync() хиты ... await _context ..., он возвращается, и Execute() затем возвращается, и я предполагаю, что в этот момент GrabJob, и, следовательно, GrabService, и, следовательно, GrabberContext, расположен, в то время как продолжение в CrawlNextAsync() продолжается (и пытается для использования размещенного GrabberContext).

В качестве простого исправления, можно попробовать изменить

public void Execute(IJobExecutionContext context) { 
    _grabService.CrawlNextAsync(""); 
} 

в

public void Execute(IJobExecutionContext context) { 
    _grabService.CrawlNextAsync("").Wait(); 
} 
+0

Я сделал точные вещи, и это сработало. благодаря попытке. ура –