gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:51:58 27 4
gpt4 key购买 nike

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

  • 安卓
  • iOS

  • 你好吗 ObserveOn主线程?看起来不像 ObserveOnDispatcher()使用 Xamarin 时,可在 iOS 或 Android 下使用。

    这个示例确实有效,因为我知道我在订阅时在主线程上。我只是不知道是否有更正式的处理方式:“始终”使用主线程,即使我不在主线程上。
    myObservable // assume this does work on an alternate thread
    .ObserveOn(SynchronizationContext.Current)
    .Subscribe(OnMyObservableNext);

    同样,如果我在主线程上,比如在单击事件处理程序中,我知道使用 SynchronizationContext.Current会让我回到那个线程。在测试中,我也验证了这一点。

    我正在寻找的情况是我可能不在主线程上并且我想回到那里(从 PCL)。

    我可以想到一个解决方案来存储 SynchronizationContext.Current在静态类上,在 iOS 的情况下,在 FinishedLaunching应用程序委托(delegate)的方法。我不知道这是否可取。

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

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

    最佳答案

    AFAIK 没有您可以使用的开箱即用的调度程序。

    你有什么
    与一些注入(inject)配对
    http://www.introtorx.com/content/v1.0.10621.0/16_TestingRx.html#SchedulerDI

    是我在大多数推荐中看到的
    Call method on UI thread from background in .net 2.0

    或者,如果您使用的是 Xamarin 表单,请从订阅中使用它

    https://developer.xamarin.com/guides/xamarin-forms/platform-features/device/#Device.BeginInvokeOnMainThread

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

    ReactiveUI 确实有一些自定义调度程序实现,用于获取调度程序线程

    https://github.com/reactiveui/ReactiveUI/blob/b418df64918da0c78a378af1b846afbab0f4e5ae/src/ReactiveUI/Android/AndroidUIScheduler.cs

    https://github.com/reactiveui/ReactiveUI/blob/b418df64918da0c78a378af1b846afbab0f4e5ae/src/ReactiveUI/Cocoa/NSRunloopScheduler.cs

    所以你也可以尝试一下,但我不太确定在 SynchronizationContext 上使用它们的区别/优势

    关于c# - 在 Android 或 iOS 平台中,应该使用哪个 Rx 调度程序来观察主线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44006458/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com