2013-11-03 10 views
0

에 두 개의 이벤트를 결합 : IObserver.OnNext을 발사합니다내가 다음 인터페이스를 IObservable

public interface ITask 
{ 
    event EventHandler<EventArgs> Completed; 
    event EventHandler<UpdateEventArgs> Update; 
} 

내가 IObservable을 할 때 ITask.Update 이벤트가 발생하고 IObserver.OnCompleted ITask.Completed 이벤트가 발생합니다. RX를 사용하여이 작업을 수행 할 수 있습니까? 그렇지 않을 수 있으며,이를 구현할 수 있습니다. 이 LKE

+0

'ITask'는'System.Threading.Tasks' 네임 스페이스에서 혼동을 일으키는 이름입니다. 나는 개인적으로 다른 것을 선택할 것이다 ... –

답변

4

:

표준 .NET 이벤트를 게시 한 후 표준 이벤트를 래핑하고 끝나는 관찰 시퀀스가 ​​"완료되면 다음 5"업데이트 "를 표시하는 인위적인 예,의
/* Assume you have an instance of ITask here */ 
ITask task; 

var updates = Observable.FromEventPattern<UpdateEventArgs>(task, "Update"); 
var completed = Observable.FromEventPattern<EventArgs>(task, "Completed"); 

var desiredStream = updates.TakeUntil(completed); 

/* example usage */ 
desiredStream.Subscribe(Console.WriteLine, 
         () => Console.WriteLine("Done")); 
1

"발생합니다.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Reactive; 
using System.Reactive.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public class UpdateEventArgs : EventArgs 
    { 
     public string Value { get; set; } 
    } 
    public interface ITask 
    { 
     event EventHandler<EventArgs> Completed; 
     event EventHandler<UpdateEventArgs> Update; 
    } 

    public partial class Form1 : Form, ITask 
    { 
     public event EventHandler<EventArgs> Completed; 

     public event EventHandler<UpdateEventArgs> Update; 

     private Timer m_timer = new Timer(); 

     private int m_timercount = 5; 

     public Form1() 
     { 
      InitializeComponent(); 

      var obUpdate = Observable.FromEventPattern<UpdateEventArgs>(this, "Update"); 
      var obCompleted = Observable.FromEventPattern<EventArgs>(this, "Completed"); 

      var obUpdatesUntilCompletedSequence = obUpdate.TakeUntil(obCompleted); 

      obUpdatesUntilCompletedSequence.Subscribe(new Action<EventPattern<UpdateEventArgs>>(UpdateOccurred), new Action(UpdateCompleted)); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      m_timer.Interval = 1000; 
      m_timer.Start(); 
      m_timer.Tick += m_timer_Tick; 
     } 

     void m_timer_Tick(object sender, EventArgs e) 
     { 
      Update(this, new UpdateEventArgs { Value = DateTime.Now.ToString() }); 

      if (--m_timercount == 0) 
      { 
       Completed(this, new EventArgs()); 

       m_timer.Stop(); 
      } 
     } 

     private void UpdateOccurred(EventPattern<UpdateEventArgs> update) 
     { 
      System.Diagnostics.Debug.WriteLine(update.EventArgs.Value); 
     } 

     private void UpdateCompleted() 
     { 
      System.Diagnostics.Debug.WriteLine("No more updated will be received"); 
     } 
    } 
} 
관련 문제