C# 在Android或iOS平台内,应使用哪个Rx调度程序来观察主线程?

C# 在Android或iOS平台内,应使用哪个Rx调度程序来观察主线程?,c#,xamarin,system.reactive,C#,Xamarin,System.reactive,在特定于平台的项目中使用Rx.NET时 安卓 iOS 你如何观察主线程?在使用Xamarin时,iOS或Android下似乎没有提供ObserveOnDispatcher() 这个示例确实有效,因为我知道我在订阅时处于主线程。我只是不知道是否有更正式的方式来处理:“始终”使用主线程,即使我不在主线程上 myObservable // assume this does work on an alternate thread .ObserveOn(SynchronizationContext.C

在特定于平台的项目中使用Rx.NET时

  • 安卓
  • iOS
你如何观察主线程?在使用Xamarin时,iOS或Android下似乎没有提供
ObserveOnDispatcher()

这个示例确实有效,因为我知道我在订阅时处于主线程。我只是不知道是否有更正式的方式来处理:“始终”使用主线程,即使我不在主线程上

myObservable // assume this does work on an alternate thread
.ObserveOn(SynchronizationContext.Current)
.Subscribe(OnMyObservableNext);
同样,如果我在主线程上,比如在单击事件处理程序中,我知道使用
SynchronizationContext.Current
将使我回到该线程。在测试中,我也验证了这一点

不过,我正在寻找的是,我可能不在主线程上,我想回到那里(从PCL)

我可以想出一个解决方案,在应用程序委托的
FinishedLaunching
方法中,在静态类上存储
SynchronizationContext.Current
。我不知道这是否明智

上面提到的解决方案是这样的:

PCL

namespace MyPCL
{

    public static class Settings
    {
        // obvioulsy probably don't want public setter, 
        // don't want anyone reaching in here and changiing it
        // from under us. But for the example this is fine.
        public static SynchronizationContext MainContext { get; set; }
    }
}
iOS

using MyPCL;

namespace MyApp.iOS
{
    [Register ("AppDelegate")]
    public class AppDelegate : UIApplicationDelegate
    {
        public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
        {
            // ...
            Settings.MainContext = SynchronizationContext.Current;
            // ^^^^ Save the Main SynchronizationContext 
            // ...
            return true;
        }
    }
}

抱歉,没有现成的调度器可以使用

你有什么 配合一些注射

这是我在大多数推荐中看到的

或者如果您使用的是Xamarin表单,只需从订阅中使用它即可

这不是最漂亮的事情,但它是有效的

ReactiveUI确实有一些用于访问调度程序线程的自定义调度程序实现


因此,您也可以尝试一下,但我不太确定在SynchronizationContext上使用这些工具的区别/优势

RxApp
需要使用
ReactiveUI
包,该包与反应式扩展的v2.x.x相关联。显然,关于只使用
ReactiveUI
的利/弊,有一个合理的论据,但在不使用
ReactiveUI
的情况下,
RxApp.MainThreadScheduler
将不存在。读取失败:-(出于某些原因,我认为你在使用RxUI…让我更新我的答案好吧,很抱歉@AdamVenturella我编辑了我的答案,希望能更有用第一个链接断开了。其他链接没有提供具体的答案。那么推荐的方法是什么?