2017-06-01 64 views
0

我想根據ManualResetEvent的Sets/Resets創建一個IObservable-stream,例如,原則上類似於ManualResetEvent到IObservable <bool>(或WaitHandle到IObservable <Unit>)?

IObservable<bool> ToObservable(ManualResetEvent ev) 
{ 
    var s = new Subject<bool>(); 
    ev.OnSet += s.OnNext(true); 
    ev.OnReset += s.OnNext(false); 
    return s; 
} 

只有ManualResetEvent不會公開這些事件。那麼有沒有什麼方法可以觀察這種情況何時停止/重置?

對於記錄來說,如果設置/未設置爲真/假的區分是不可能的,那麼只要ManualResetEvent的狀態改變也是可以的,則更簡單的IObservable單元推動一個值。

有沒有辦法做到這一點?

我找到了一個文章,解釋如何轉換一個ManualResetEvent的(或者說,在一般的WaitHandle)到一個任務(Wrapping ManualResetEvent as awaitable task),這似乎只要完成下一次是ManualResetEvent的變化(從設定到未設置或其他方式)。 但我還沒有真正找到任何方式,我可以如何將它鏈接到一個序列中(例如,在任務完成後,我需要爲下一個事件創建另一個事件等,並以某種方式創建一個可見的「遞歸」序列)

謝謝!

回答

0

有許多不同的方法可以做到這一點,但東西喜歡這樣的:

public static class ManualResetEventObservable 
{ 
    public static IObservable<bool> Create(ManualResetEvent e, TimeSpan timeout) 
    { 
     return Observable.Create<bool>(observer => 
     { 
      var cancelEvent = new ManualResetEvent(false); 
      var waitHandles = new[] { cancelEvent, e }; 
      var thread = new Thread(new ThreadStart(() => 
      { 
       var index = WaitHandle.WaitAny(waitHandles, timeout); 
       if (index == 1) 
        observer.OnNext(true); 

       observer.OnCompleted(); 
      })); 
      thread.Start(); 
      return Disposable.Create(() => cancelEvent.Set()); 
     }); 
    } 
相關問題