![](/img/trans.png)
[英]Un-subscribing from CollectionChanged event of a collection stored in an attached property
[英]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.