【发布时间】: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