Я не могу отменить подписку на событие при использовании 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, но он останется подписанным.