Ссылка на главный 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 шт):

Автор решения: XOneGS

Огромная благодарность 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
                
            }
    
        }
→ Ссылка