【问题标题】:Reactive Extensions - Correct way to observe a Javascript call into C# wrapper反应式扩展 - 观察对 C# 包装器的 Javascript 调用的正确方法
【发布时间】:2016-09-12 12:56:22
【问题描述】:

我正在开发一个包含 Web 浏览器控件的 C# WinForms 应用程序。该应用程序包含一个“脚本桥”类,它允许 Javascript 代码调用 Web 浏览器控件(我需要知道何时在 JS 代码中调用某些函数以便在 WinForms 应用程序中执行某些操作)。大多数这些操作都是异步的,因为当我从 WinForms 应用程序启动请求时,它通常会在 JS 代码(而不是 C# 代码)中执行 ajax 请求。由于这是一个异步操作,我试图想出一种更好/更简单的方法来管理这些异步事件的订阅/超时/错误处理等。我遇到了 Reactive Extensions 并决定尝试一下。

我正在尝试确定我是否正确执行此操作。我正试图围绕反应式扩展。对于许多 Observable 扩展方法,很难在网上找到更简单的示例。这是我现在正在做的事情:

public void SetupObservable()
{
    IConnectableObservable<string> javascriptResponseObservable = Observable.Create<string>(
        (IObserver<string> observer) =>
        {
            observer.OnNext("Testing");
            observer.OnCompleted();

            return Disposable.Create(() => Console.WriteLine("Observer has unsubscribed"));
        })
        .Timeout(DateTimeOffset.UtcNow.AddSeconds(5))
        .Finally(() => Console.WriteLine("Observable sequence completed"))
        .Publish();

        IObserver<string> testObserver = Observer.Create<string>(
            (value) => Console.WriteLine(value),
            (e) => Console.WriteLine("Exception occurred: " + e.Message),
            () => Console.WriteLine("Completed")
        );

    IDisposable unsubscriber = javascriptResponseObservable.Subscribe(testObserver);
}

// The following will be executed later (once the ajax request is completed)...

// Fire the event and notify all observables. If it took too long to get this point then the sequence will timeout with an exception.
public void OnSomeJavascriptFunctionCall()
{
    // Somehow get the javascriptResponseObservable object...
    javascriptResponseObservable.Connect();
}

我觉得我这样做是错误的,或者有更好的方法来实现这一点。例如,如何检索之前创建的 IObservable,以便可以在其上调用更多方法?我是否必须在课堂上或其他地方坚持它?似乎很多示例都没有这样做,所以似乎我在做一些根本错误的事情。此外,如果有多个观察者从不同的类等订阅 IObservable,那么您如何跟踪 IObservable?似乎它需要在创建后保留在某个地方。是否有某种我缺少的 Observable.GetExistingObservable() 方法?

【问题讨论】:

    标签: c# system.reactive


    【解决方案1】:

    我觉得我做错了,或者有更好的方法来完成这个。

    错误始终是一种观点,但我认为,是的,有更好的方法来解决你正在做的事情。

    我假设你的 JavaScript 桥有某种引发事件的方式?这就是它能够回电的方式吗?如果是这样,您将希望利用该回调并使用 Observable.CreateObservable.FromEvent* 或其他 Rx 工厂方法将其桥接到 Rx。

    这将是您的第一步,然后您需要将“命令”传递给您的 JS 层。这是您需要记住在发出命令以缓解任何竞争条件之前订阅您的回调序列的地方。

    这很难再提供帮助,因为您只展示了除了试图理解 Rx 之外似乎没有任何目的的 Rx 代码,并且没有展示您在 C#-to-Js 桥中尝试实现的目标的代码。请提供“最小完整可验证示例”-https://stackoverflow.com/help/mcve

    【讨论】:

      猜你喜欢
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      相关资源
      最近更新 更多