Использование события ручного сброса до последнего изменения свойства

Я перезвонил, когда пришло уведомление об изменении свойства из прошивки. Теперь в моем коде я хочу подождать, пока я не нажму последнее изменение свойства. Я прочитал следующий пост Событие ручного сброса относительно Manual Reset Event, но там говорится, что события ручного сброса используются в случае многопоточности. Я новичок в Manual Reset Events. Это мой следующий код, могу ли я использовать событие ручного сброса в моем случае? если так как? Если нет, то какой лучший способ там ждать? Пожалуйста помоги.

    //This is some button click action of RelayCommand
        private void StartCurrentRun(bool obj)
                {
                    this.worker = new BackgroundWorker();
                    this.worker.WorkerReportsProgress = true;
                    this.worker.WorkerSupportsCancellation = true;
                    OriginalTime = SelectedVolumeEstimatedTime();
                    StartTimer();
                    WhenCancelledBlurVolumesGrid = false;
                    //this.worker.DoWork += this.DoWork;
                    //this.worker.ProgressChanged += this.ProgressChanged;
                    //this.worker.RunWorkerCompleted += Worker_RunWorkerCompleted;
                    //this.worker.RunWorkerAsync();
                    IsLiveProgress = true;
                    CreateEventLogs.WriteToEventLog(string.Format("Run with Assay:{0} Volume{1} has been started", SelectedAssay, SelectedVolume), LogInformationType.Info);
                    var instance = ConnectToInstrument.InstrumentConnectionInstance;
                    instance.InitalizeRun(PopulateRespectiveVolumes());
                    PropertyCallBackChangedInstance.PropertyChanged += PropertyCallBackChangedInstance_PropertyChanged;

        //Here I want to perform some action after I get a Processed state after the final property change event occurs. 
    //Can I do a manual reset event here.
                }

        private void PropertyCallBackChangedInstance_PropertyChanged(object sender, PropertyChangedEventArgs e)
                {
                    try
                    {
                        if (e.PropertyName == "InstrumentStatusChanged")
                        {
                            var value = sender as InstrumentCallBackProperties;
                            if (value.InstrumentStatusChanged == CurrentInstrumentStatus.Busy)
                            {
                                CurrentStatus = Application.Current.TryFindResource("Wait").ToString();
                            }
                        }
                        if (e.PropertyName == "RunStepStatusName")
                        {
                            var value = sender as InstrumentCallBackProperties;
                            CurrentStatus = EnumExtensions.GetDescription(value.RunStepStatusName);
                            NewProgressValue += 20;
                            UpdateProgress = true;
                        }

                        else if (e.PropertyName == "CurrentCartridgeStatusChanged")
                        {
                            var value = sender as InstrumentCallBackProperties;
                            if (value.CurrentCartridgeStatusChanged == CurrentCartridgeStatus.Processed)
                            {
                                PropertyCallBackChangedInstance.PropertyChanged -= PropertyCallBackChangedInstance_PropertyChanged;
                                EstimatedTimeRemaining = "00:00:00";

                                stopWatch.Stop();
                                timer.Stop();
                                IsLiveProgress = false;
                                CreateEventLogs.WriteToEventLog(string.Format("Run with Assay:{0} Volume{1} has been completed", SelectedAssay, SelectedVolume), LogInformationType.Info);

                                    if (IsRunSuccessfullyComplete != null && !WhenCancelledBlurVolumesGrid) //This indicates that Success will only open when the run is complete
                                    {
                                        IsRunSuccessfullyComplete();
                                    }
                                    WhenCancelledBlurVolumesGrid = true;

                                    if (ClearSelections != null)
                                    {
                                        ClearSelections();
                                    }
                            }
                        }

                    }
                    catch (Exception ex)
                    {
                        CreateEventLogs.WriteToEventLog(string.Format("Run with Assay:{0} Volume{1} failed", SelectedAssay, SelectedVolume), LogInformationType.Error);
                    }
                }

1 ответ

Мне не кажется, что вы хотите ManualResetEvent, который используется для подачи сигнала нескольким слушателям. Если ваши результаты были получены с помощью нескольких задач, вы должны использовать await WhenAll (...), однако в вашем случае результаты сообщаются при изменении свойства, а не при завершении задачи. Я бы посоветовал вам просто записывать каждое уведомление о недвижимости, когда оно происходит, и проверять, все ли они завершены. Самый простой способ сделать это - использовать перечисление с атрибутом [Flags]: [Flags]public enum Completions { InstrumentStatusChanged, CurrentCartridgeStatusChanged, RunStepStatusName }. Просто установите соответствующий флаг для каждого обратного вызова свойства, и когда вы установили все флаги, все готово. Если обратные вызовы свойств могут происходить параллельно или в разных потоках, вам понадобится некоторая форма блокировки, например, SemaphoreSlim(1,1).

Другие вопросы по тегам