簡體   English   中英

在其他活動中取消訂閱活動

[英]Un-subscribing from event in other events

在使用BackgroundWorker處理取消訂閱事件時,我沒有取消訂閱事件。 我可以在AsyncRunner中取消訂閱,但不能在BackgroundWorker1_RunWorkerCompleted中取消訂閱。

上下文:這是Autodesk Revit插件的一部分。 我們想要在后台更新一些文件,但在我們這樣做的時候,我們希望將命令捕獲到受影響的部分並取消它。

我可以成功捕獲命令並取消它,但是一旦BackgroundWorker結束,我就無法取消訂閱。

任何時候都不會拋出異常。 編輯:它拋出一個“System.AccessViolationException HResult = 0x80004003 Message =嘗試讀取或寫入受保護的內存。這通常表明其他內存已損壞.Source =無法評估異常源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的新手,但我希望我可以在BackgroundWorker1_RunWorkerCompleted中從Command.BeforeExecuted取消訂閱,但它仍然訂閱。

對我而言,它看起來和聽起來就像是在嘗試進行交互而不是在有效的Revit API上下文中。 如果你幸運的話,這是不允許的,會拋出這樣的例外。 如果最糟糕的情況發生,您可能根本看不到任何異常,只會破壞您的模型。 災難!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM