WPF и MessageBox в отдельном потоке

389
08 февраля 2017, 22:22

Имеется приложение WPF, служит для дозирования жидкостей. При каждом новом дозировании необходимо проверить, сменилась ли емкость под дозатором, и если нет, то вывести сообщение о необходимости смены емкости. Есть такой код

    public bool CheckChangeCupInThread()
    {
        if (_dispenser.Status.CupChanged == DispenserEnums.CupChanged.False)
        {
            var cupFormThread = new ThreadStart(CupWaitChangeForm);
            var cupFormWaiter = new Thread(cupFormThread) {IsBackground = true};
            cupFormWaiter.SetApartmentState(ApartmentState.STA);
            var cupThread = new ThreadStart(WaitForCupChange);
            var cupWaiter = new Thread(cupThread) {IsBackground = true};
            cupWaiter.SetApartmentState(ApartmentState.STA);
            cupFormWaiter.Start();
            cupWaiter.Start();
            do
            {
                //Wait for Cup to be changed or Cancel
            } while (cupFormWaiter.IsAlive && cupWaiter.IsAlive);
            var watch = new Stopwatch();
            watch.Start();
            if (cupFormWaiter.IsAlive)
            {
                cupFormWaiter.Abort();
                cupFormWaiter.Join();
            }
            if (cupWaiter.IsAlive)
            {
                _dispenser.SurveillanceWorker.Continue = false;
                cupWaiter.Join(200);
                return false;
            }
            watch.Stop();
        }
        return true;
    }
    private void WaitForCupChange()
    {
        do
        {
            _dispenser.GetStatus();
        } while (_dispenser.Status.CupChanged == DispenserEnums.CupChanged.False);
    }
    private void CupWaitChangeForm()
    {
        MessageBox.Show("Change please the cup", "Cup сhange", MessageBoxButtons.Cancel);
    }

здесь _dispenser собственно и есть дозатор. Принцип такой: или емкость сменили, или клавишу "Отмена" в MessageBox нажали, потоки завершаются с соответствующим результатом. Все вроде нормально на первый взгляд. Но очень часто этот код приводит к аварийному завершению работы программы. Пробовал сделать тоже самое с тасками, но как-то не очень получилось, в многопоточных приложениях я новичок. Работаю с WPF и паттерном MVVM.

READ ALSO
Стили форматирования DataGridView

Стили форматирования DataGridView

Есть DataGridView, который отображает коллекцию экземпляров SomeClass

501
Где можно скачать готовый стиль и триггер для компонента MENU в WPF? [требует правки]

Где можно скачать готовый стиль и триггер для компонента MENU в WPF? [требует правки]

Добрый день! Подскажите, где можно скачать готовые стили для компонент WPF?

359
Класс-конструктор-как реализовать? [требует правки]

Класс-конструктор-как реализовать? [требует правки]

Есть несколько классов с параметрами, задача-один из них заменить или добавить класс-конструктор Задачка лёгкая, уровня начальной школы,...

289