【问题标题】:Cross AppDomain "Cancelable" event跨 AppDomain “可取消”事件
【发布时间】:2014-11-24 22:11:17
【问题描述】:
我正在实现一个具有多个 AppDomain 的应用程序。大多数跨域通信是通过使用事件机制来完成的。一切都很好,除了那些 EventArgs 类包含带有 setter 的属性的事件。以下是 EventArgs 类的示例:
[Serializable]
public class CancelableEventArgs : EventArgs
{
public bool Cancel { get; set; }
}
事件已成功触发,但如果我在第二个 AppDomain(订阅者)中设置了 Cancel 属性,则在事件执行结束后它不会持久化回第一个 AppDomain(发布者)。这是设计使然,还是我遗漏了什么?
【问题讨论】:
标签:
c#
.net
events
appdomain
【解决方案1】:
AppDomain 之间可以传递两种对象:serializable 和 MarshalByRefObject。
可序列化对象(如您帖子中的 EventArgs)在一个 AppDomain 中序列化为一些字节表示对象,并在另一个 AppDomain 中反序列化。这意味着另一个 AppDomain 接收到原始对象的副本。
此外,继承 MarshalByRefObject 的对象可以在 AppDomain 之间通过引用传递。如果您继承 MarshalByRefObject 而不是使您的对象可序列化,它可能会解决您的问题。
【解决方案2】:
仍然希望有更好的方法来做到这一点,但这是我使用的解决方法:
[Serializable]
public class CancelableEventArgs : EventArgs
{
public MarshalByRefWrapper<bool> Cancel { get; set; }
}
public class MarshalByRefWrapper<T> : MarshalByRefObject
{
public T Value { get; set; }
}
【解决方案3】:
我并不完全理解它是如何工作的。
但是有两个项目:
- 从 MarshalByRefObject 继承(用于跨域)
- EventArgs 的隐式运算符(用于 EventHandler)
在我这里转而传输数据,比如TypedDataSet和string
public class MyEventArgs : MarshalByRefWrapper<EventArgs>
{
public DataTable SystemState { get; set; }
public string SystemString { get; set; }
}
public class MarshalByRefWrapper<T> : MarshalByRefObject
{
public MarshalByRefWrapper()
{
}
public MarshalByRefWrapper(T value)
{
Value = value;
}
public T Value { get; set; }
public static implicit operator MarshalByRefWrapper<T>(T value)
{
return new MarshalByRefWrapper<T>(value);
}
}