Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在被动扩展中一次处理一个事件 让我们考虑下面的流 SomeState state = new SomeState(). _refreshFiberStream = Stream() .SubscribeOn(new EventLoopScheduler()) .Select(DoCalc) .ObserveOn(DispatcherScheduler.Current) .Subscribe(Update);_C#_System.reactive - Fatal编程技术网

C# 在被动扩展中一次处理一个事件 让我们考虑下面的流 SomeState state = new SomeState(). _refreshFiberStream = Stream() .SubscribeOn(new EventLoopScheduler()) .Select(DoCalc) .ObserveOn(DispatcherScheduler.Current) .Subscribe(Update);

C# 在被动扩展中一次处理一个事件 让我们考虑下面的流 SomeState state = new SomeState(). _refreshFiberStream = Stream() .SubscribeOn(new EventLoopScheduler()) .Select(DoCalc) .ObserveOn(DispatcherScheduler.Current) .Subscribe(Update);,c#,system.reactive,C#,System.reactive,DoCalc方法将投射到输入中并使用“state”,结果输出将提供给Update方法,Update方法将修改“state”。若一个新事件出现,它应该根据上一个事件最后更新的状态进行操作,并基于该状态进行项目 我正在寻找一种总是按顺序执行事件的方法。例如,如果我有三个事件,我正在寻找一种方法,以使它们在DoCalc中执行,Update后跟DoCalc,Update后跟DoCalc,Update 相反,我看到的是DoCalc,DoCalc,Update,Update,DoCalc,Update,即它

DoCalc方法将投射到输入中并使用“state”,结果输出将提供给Update方法,Update方法将修改“state”。若一个新事件出现,它应该根据上一个事件最后更新的状态进行操作,并基于该状态进行项目

我正在寻找一种总是按顺序执行事件的方法。例如,如果我有三个事件,我正在寻找一种方法,以使它们在DoCalc中执行,Update后跟DoCalc,Update后跟DoCalc,Update

相反,我看到的是DoCalc,DoCalc,Update,Update,DoCalc,Update,即它们从不按顺序运行


是否有一种方法可以在Rx中强制执行它?我发现一方面需要按顺序执行,另一方面需要调度到另一个线程。我的建议是将
Update
分为两部分:

  • 需要按顺序执行的部件(更新)
  • 需要分派的部件(分派)
  • 然后您可以依次调用
    Do(Update)
    ,并在dispatcher上调用
    Subscribe(Dispatch)

    var result =
        Stream()
            .SubscribeOn(new EventLoopScheduler())
            .Select(DoCalc)
            .Do(Update)
            .ObserveOn(DispatcherScheduler.Current)
            .Subscribe(Dispatch);
    
    生成的序列如下(“Dispatch n”调用可以在“Update n”之后的任何时间发生):


    第二种方法“有效”,但像这样的线程阻塞让我感到不安——它似乎与反应式编程有交叉作用。当然,同样地,

    我发现修改共享状态的需要、使用Rx和添加并发性之间存在冲突;-)@李坎贝尔:是的,说得好。。。并发和共享状态需要以某种方式分开。@McGarnagle我想避免线程阻塞,因为这不是正确的方法,我同意并发和共享状态不能同时进行。 Select a Update a Select b Update b Dispatch a Dispatch b
    private ManualResetEvent _wait = new ManualResetEvent(true);
    
    private string DoCalc(string input)
    {
        _wait.WaitOne();
        Console.WriteLine("Selected {0}", input);
        _wait.Reset();
        return input;
    }
    
    private void Update(string input)
    {
        Console.WriteLine("Update {0}", input);
        _wait.Set();
    }