Отказ от подписки на событие в других событиях - PullRequest
0 голосов
/ 02 апреля 2019

Я не могу отменить подписку на событие при использовании BackgroundWorker для обработки, когда событие отмены подписки должно быть запущено.Я могу отменить подписку в AsyncRunner, но не в BackgroundWorker1_RunWorkerCompleted.

Контекст: это часть подключаемого модуля для Autodesk Revit.Мы хотим обновить некоторые файлы в фоновом режиме, но пока мы делаем это, мы хотим перехватить команду для затронутых частей и отменить ее.

Я могу успешно перехватить команду и отменить ее, но не могу отменить ее подписку после завершения BackgroundWorker.

Никаких исключений не выдается ни в одной точке. РедактироватьВыдает «System.AccessViolationException HResult = 0x80004003 Сообщение = Попытка чтения или записи защищенной памяти. Это часто указывает на повреждение другой памяти. Источник = Невозможно оценить источник исключения. StackTrace: Невозможно оценить трассировку стека исключений», когдапрограмма хоста завершается.

using System.Threading;
using System.ComponentModel;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Events;

namespace RevitAsyncTest
{
    class Asyncer 
    {
        private static AddInCommandBinding Command { get; set; }

        internal static void AsyncRunner(UIControlledApplication app)
        {
            // Assign command and eventhand and subscribe to commandevents. 
            Command = app.CreateAddInCommandBinding(RevitCommandId.LookupCommandId("ID_VISUAL_PROGRAMMING_DYNAMO"));
            Command.BeforeExecuted += DynaExecuted;

            // Setup background worker 
            BackgroundWorker BackgroundWorker1 = new BackgroundWorker();
            BackgroundWorker1.DoWork += BackgroundWorker1_DoWork;
            BackgroundWorker1.RunWorkerCompleted += 
            BackgroundWorker1_RunWorkerCompleted;
            BackgroundWorker1.RunWorkerAsync();

            // I can un-subscribe here but this defeats the purpose
            Command.BeforeExecuted -= DynaExecuted;
        }

        private static void DynaExecuted(object sender, BeforeExecutedEventArgs e)
        {
            // Make user facing explanation
            e.Cancel = true;
        }

        private static void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            // Boilerplate code - replace later. 
            Thread.Sleep(30000);
        }

        private static void BackgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {   
            // I can't un-subscribe here?!?!
            Command.BeforeExecuted -= DynaExecuted;
        }

    }
}

Я довольно новичок в EventHandlers, но ожидал, что могу отменить подписку на Command.BeforeExecuted в BackgroundWorker1_RunWorkerCompleted, но он останется подписанным.

1 Ответ

0 голосов
/ 03 апреля 2019

Для меня это выглядит и звучит так, как будто вы пытаетесь взаимодействовать, не находясь в допустимом контексте Revit API.Это недопустимо и выкинет такое исключение, если вам повезет.Если худшее становится худшим, вы можете вообще не видеть никаких исключений и просто испортить свою модель.Катастрофа!

...