【问题标题】: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】:

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

      1. 从 MarshalByRefObject 继承(用于跨域)
      2. 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);
          }
      }
      

      【讨论】:

      • 请解释您的答案是如何工作的,而不仅仅是代码。
      • 请阅读我关于跨AppDomain通信的博客blog.vcillusion.co.in/…
      猜你喜欢
      • 1970-01-01
      • 2011-02-14
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      相关资源
      最近更新 更多