【问题标题】:Create an Observable from event delegate从事件委托创建一个 Observable
【发布时间】:2018-08-22 13:37:26
【问题描述】:

我必须以这种方式映射来自使用本机驱动程序完成的设备硬件的输入:

GIS_LF_API.TSLF_SetReaderMode(handle, 1);
GIS_LF_API.TSLF_StartAutoRead(handle, '\r', AutoReadProc);

AutoReadProc 在输入来自硬件时被调用,并以这种方式定义以调用我的 OnCallback 方法:

private GIS_LF_API.AutoReadCallback AutoReadProc = OnCallback;
private static int OnCallback(string Arr, int Len)
{
    //do somethings
    return intValue;
}

驱动程序中的AutoReadCallback 定义如下:

public delegate int AutoReadCallback([MarshalAsAttribute(UnmanagedType.LPStr)] string pData, int Len);

现在我想在调用事件时映射Observable<int>。 怎么可能呢?我尝试过使用Observable.FromEventPattern,但我还没有找到映射它的方法。

【问题讨论】:

    标签: c# observable system.reactive


    【解决方案1】:

    您可以在委托周围粘贴一个事件,然后使用Observable.FromEvent(可能是首选),或者在您的处理程序中粘贴一个Subject,并将主题公开为可观察对象。

    事件解决方案:

    public class X
    {
        public X()
        {
            AutoReadProc += OnCallback; //If still necessary.
            IntObservable = Observable.FromEvent<GIS_LF_API.AutoReadCallback, int>(h => AutoReadProc += h, h => AutoReadProc -= h);
        }
    
        public event GIS_LF_API.AutoReadCallback AutoReadProc;
        private int OnCallback(string Arr, int Len)
        {
            //do something, if necessary. Not required for observable.
            var intValue = 0;
            return intValue;
        }
        public IObservable<int> IntObservable { get; }
    
    }
    

    题目解决方案:

    public class Y
    {
        private readonly Subject<int> _subject = new Subject<int>();
        public Y()
        {
            IntObservable = _subject.AsObservable();
        }
    
        private int OnCallback(string Arr, int Len)
        {
            //do something
            var intValue = 0;
            _subject.OnNext(intValue);
            return intValue;
        }
        public IObservable<int> IntObservable { get; } 
    
    }
    

    我将OnCallback 设为非静态,这与您的解决方案不同。如果是静态的,它仍然可以工作,但 Subject 也必须是静态的。

    【讨论】:

      【解决方案2】:

      试一试:

      void Main()
      {
          var foo = new Foo();
      
          Observable
              .FromEvent<AutoReadCallback, int>(a => (pd, l) =>
              {
                  var r = pd.Length + l;
                  a(r);
                  return r;
              }, h => foo.AutoReadCallback += h, h => foo.AutoReadCallback -= h)
              .Subscribe(x => Console.WriteLine(x));
      
          foo.OnAutoReadCallback("Bar", 2);
      }
      
      public delegate int AutoReadCallback(string pData, int Len);
      
      public class Foo
      {
          public event AutoReadCallback AutoReadCallback;
      
          public int OnAutoReadCallback(string pData, int len)
          {
              var arc = this.AutoReadCallback;
              if (arc != null)
              {
                  return arc(pData, len);
              }
              return -1;
          }
      }
      

      事件处理程序返回一个值很奇怪,所以这段代码有一些看起来冗余的代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多