【问题标题】:Combine two events into IObservable将两个事件组合成 IObservable
【发布时间】:2013-11-04 00:11:41
【问题描述】:

我有下一个界面:

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

我想要 IObservable,它会在 ITask.Update 事件触发时触发 IObserver.OnNext,在 ITask.Completed 事件触发时触发 IObserver.OnCompleted。我可以使用 RX 完成这种组合吗,否则这是不可能的,我应该为此进行自定义实现。

【问题讨论】:

  • ITask 是一个令人困惑的名称,因为 System.Threading.Tasks 命名空间。我个人会选择别的东西......

标签: c# .net system.reactive


【解决方案1】:

像这样:

/* 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"));

【讨论】:

    【解决方案2】:

    这是一个人为的示例,它显示了 5 个“更新”发布在您的标准 .NET 事件上,然后是一个可观察的序列,该序列包装了标准事件并在“完成”发生时结束。

    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");
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      相关资源
      最近更新 更多