Серверная часть Blazor: подписка на событие

#c# #asp.net-core #events #blazor

#c# #asp.net-core #Мероприятия #blazor

Вопрос:

Мне трудно понять, как я могу подписаться на событие на странице Blazor.

У меня есть этот класс, который реализует IJobListener .NET-интерфейс Quartz:

 public class GlobalJobListener : IJobListener
    {
        public event TaskExecution Started;
        public event TaskExecution Vetoed;
        public event TaskExecutionComplete Executed;

        public GlobalJobListener(string name)
        {
            Name = name;
        }
        public GlobalJobListener()
        {
           
        }

        public Task JobToBeExecuted(IJobExecutionContext context, CancellationToken cancellationToken = default(CancellationToken))
        {
            var task = new Task(() => Started?.Invoke());
            task.Start();
            task.Wait();
            return task;
        }

        public Task JobExecutionVetoed(IJobExecutionContext context, CancellationToken cancellationToken = default(CancellationToken))
        {
            var task = new Task(() => Vetoed?.Invoke());
            task.Start();
            task.Wait();
            return task;
        }

        public Task JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException, CancellationToken cancellationToken = default(CancellationToken))
        {
            var task = new Task(() => Executed?.Invoke(jobException));
            task.Start();
            task.Wait();
            return task;
        }

        public string Name { get; }
    }
  

В ConfigureServices :

 services.AddScoped<GlobalJobListener>();
  

Затем на странице my .razor:

 [Inject]
 protected GlobalJobListener listener { get; set; }
  

И OnInitializedAsync() :

  protected override async Task OnInitializedAsync()
        {
            scheduler = quartz.Scheduler;
            if (scheduler != null)
            {                
                listener.Started  = BeforeStart;
                listener.Executed  = AfterEndAsync;
            }
        }
  private void BeforeStart()
        {           
            Log.Information("t"   "Started: "   DateTime.Now.ToString("dd-MMM-yyyy hh:mm:ss tt"));
        }
  

И BeforeStart() никогда не срабатывает, но JobToBeExecuted() срабатывает нормально. Я не могу понять, что я делаю неправильно.

Большое спасибо.

Комментарии:

1. Что на самом деле запускает любую «работу»? Вы подключаете событие в методе асинхронного запуска, так может быть, событие сработало до того, как эта связь действительно произошла?

2. Попробуйте использовать «private Task BeforeStart ()» вместо «private void BeforeStart ()» и сделайте так, чтобы ваш метод возвращал Task. Выполненная задача