跨AppDomain"可取消"事件

时间:2014-03-31 16:05:25

标签: c# .net events appdomain

我正在实施一个包含多个AppDomain的应用程序。大多数跨域通信是通过使用事件机制完成的。除了那些EventArgs类包含带有setter的属性的事件外,一切都运行良好。以下是EventArgs类的示例:

[Serializable]
public class CancelableEventArgs : EventArgs
{
    public bool Cancel { get; set; }
}

事件成功触发,但如果我在第二个AppDomain(订阅者)中设置了Cancel属性,则在事件执行结束后,它不会持久保存回第一个AppDomain(发布者)。这种行为是设计的,还是我错过了什么?

3 个答案:

答案 0 :(得分:1)

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

可序列化对象(如帖子中的EventArgs)在一个AppDomain中序列化为某些字节表示对象,并在其他AppDomain中反序列化。这意味着其他AppDomain会收到原始对象的副本

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

答案 1 :(得分:1)

我不太了解它的工作原理。 但有两个项目:

  1. 从MarshalByRefObject继承(适用于跨域)
  2. EventArgs的隐式运算符(对于EventHandler)
  3. 在我看来,它转向传输数据,例如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);
        }
    }
    

答案 2 :(得分:0)

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

[Serializable]
public class CancelableEventArgs : EventArgs
{
    public MarshalByRefWrapper<bool> Cancel { get; set; }
}

public class MarshalByRefWrapper<T> : MarshalByRefObject
{
    public T Value { get; set; }
}