首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cross AppDomain "Cancelable“事件

Cross AppDomain "Cancelable“事件
EN

Stack Overflow用户
提问于 2014-04-01 00:05:25
回答 3查看 425关注 0票数 2

我正在实现一个具有多个AppDomains的应用程序。大部分跨域通信都是通过事件机制来完成的。除了那些EventArgs类包含带有setter的属性的事件之外,一切都运行得很好。以下是EventArgs类的示例:

代码语言:javascript
复制
[Serializable]
public class CancelableEventArgs : EventArgs
{
    public bool Cancel { get; set; }
}

事件已成功激发,但如果我在第二个订阅服务器( AppDomain )中设置了Cancel属性,则在事件执行结束后,该事件不会保留回第一个AppDomain (发布服务器)。这是故意设计的行为,还是我遗漏了什么?

EN

回答 3

Stack Overflow用户

发布于 2014-04-01 02:50:16

有两种类型的对象可以在AppDomains之间传递: serializable和MarshalByRefObject。

可序列化的对象(就像你文章中的EventArgs )在一个AppDomain中被序列化为代表对象的一些字节,并在另一个AppDomain中反序列化。这意味着另一个AppDomain接收原始对象的副本。

此外,继承MarshalByRefObject的对象可以在AppDomain之间通过引用传递。如果你继承了MarshalByRefObject而不是使你的对象可序列化,它可能会解决你的问题。

票数 1
EN

Stack Overflow用户

发布于 2014-04-01 16:52:03

我仍然希望有更好的方法来做到这一点,但这是我使用的变通方法:

代码语言:javascript
复制
[Serializable]
public class CancelableEventArgs : EventArgs
{
    public MarshalByRefWrapper<bool> Cancel { get; set; }
}

public class MarshalByRefWrapper<T> : MarshalByRefObject
{
    public T Value { get; set; }
}
票数 1
EN

Stack Overflow用户

发布于 2014-11-18 23:01:33

我不完全理解它是如何工作的。但这里有两个项目:

从MarshalByRefObject继承的

  1. (用于EventArgs的交叉Domain)
  2. implicit运算符(用于EventHandler)

在我看来,它只是传输数据,比如TypedDataSet和字符串

代码语言:javascript
复制
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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22766549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档