Ссылка на главный MainViewModel C# WPF из другого класса Quartz.Net (CS0120)
имеется проблема со ссылкой на нестатическое поле.
В приложении имеется главный класс
public class MainViewModel : ObservableObject
в котором выполняется куча всяких методов и заданий например
public async void Method2()
Также внутри класса есть крон Таймер с использованием библиотеки Quarz.Net и отдельный класс выполняемой работы. Таймер
private async Task RunQueuedEvents()
{
try
{
// Grab the Scheduler instance from the Factory
NameValueCollection props = new NameValueCollection { { "quartz.serializer.type", "binary" } };
StdSchedulerFactory factory = new StdSchedulerFactory(props);
IScheduler scheduler = await factory.GetScheduler();
// Start the Scheduler instance
await scheduler.Start();
// Define the Job
IJobDetail job = JobBuilder.Create<MyJob>()
.WithIdentity("job1", "group1")
.UsingJobData("MyCommand", "DO IT 13423")
.Build();
// Define the Trigger
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.WithCronSchedule("0 0/1 * * * ?")
.ForJob("job1", "group1")
.StartNow()
.Build();
await scheduler.ScheduleJob(job, trigger);
}
catch (SchedulerException se)
{
}
}
запускается и срабатывает нормально. А вот с выполнением работы у меня возникли трудности.
public class MyJob : IJob
{
// public string MyCommand { private get; set; }
public async Task Execute(IJobExecutionContext context)
{
Method2();
}
}
Ссылка на не Static метод вызывает ошибку
Ошибка CS0120 Для нестатического поля, метода или свойства "MainViewModel.Method2()" требуется ссылка на объект.
В примерах решения https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/compiler-messages/cs0120
написано что нужно вызвать новый экземпляр класса
public class MyJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
var mc = new MainViewModel();
mc.Method2();
}
}
но тогда все действия метода будут проводится внутри нового экземпляра, а не обновляться внутри старого.
Также как вариант решения написано добавить в свойства Method2 static, но внутри MainViewModel много async методов, который вызывают туже самую проблему при изменении части кода на static.
Вопрос: как из класса работы MyJob вызвать acync метод MainViewModel которая запускается из XAML WPF формы. Как указать ссылку на эту самую модель при запуске Method2(); Ну или какие либо еще варианты решения проблемы со ссылкой на объект.
Ответы (1 шт):
Огромная благодарность EvgeniyZ за помощь. Комментариями на русском выделил, что добавил в код.
private async Task RunQueuedEvents()
{
try
{
// Grab the Scheduler instance from the Factory
NameValueCollection props = new NameValueCollection { { "quartz.serializer.type", "binary" } };
StdSchedulerFactory factory = new StdSchedulerFactory(props);
IScheduler scheduler = await factory.GetScheduler();
// Start the Scheduler instance
await scheduler.Start();
// Define the Job
IJobDetail job = JobBuilder.Create<MyJob>()
.WithIdentity("job1", "group1")
.Build();
job.JobDataMap.Put("vm", this); //Добавление названия MainViewModel в JobDataMap
// Define the Trigger
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.WithCronSchedule("0 0/1 * * * ?")
.ForJob("job1", "group1")
.StartNow()
.Build();
await scheduler.ScheduleJob(job, trigger);
}
catch (SchedulerException se)
{
}
}
public class MyJob : IJob
{
// public string MyCommand { private get; set; }
public async Task Execute(IJobExecutionContext context)
{
var vm = (MainViewModel)context.JobDetail.JobDataMap["vm"]; //Передача имени/ссылки MainViewModel в класс MyJob из JobDataMap
vm.Method(); //Запускаемый метод/таск из MainViewModel
}
}