C# 在MonoTouch中无需UI即可获得iOS屏幕分辨率

C# 在MonoTouch中无需UI即可获得iOS屏幕分辨率,c#,ios,user-interface,xamarin.ios,uikit,C#,Ios,User Interface,Xamarin.ios,Uikit,问题是:如果没有UI线程,如何在iOS MonoTouch(如UIScreen.MainScreen.Bounds)中获得屏幕分辨率? 属性.main屏幕引发异常 UIKit Consistency error: you are calling a UIKit method that can only be invoked from the UI thread. 因此,我需要一个UI线程。但是,由于在加载应用程序之前需要解析,因此在调用UIApplication.Main()之前,UIAppl

问题是:如果没有UI线程,如何在iOS MonoTouch(如
UIScreen.MainScreen.Bounds
)中获得屏幕分辨率? 属性
.main屏幕
引发异常

UIKit Consistency error: you are calling a UIKit method that can only be invoked from the UI thread.
因此,我需要一个UI线程。但是,由于在加载应用程序之前需要解析,因此在调用
UIApplication.Main()
之前,
UIApplication.mainThread
(由调试器显示的私有成员)是
null
。我假设根本没有UI线程,因为没有UI。因此,从技术上讲,我不能对任何对象调用
InvokeOnMainThread


没有
UIScreen.MainScreen
,还有其他方法可以获得屏幕分辨率吗?否则,我将不得不将初始化移到从UI调用的一些代码。然后还有另一个问题:如何从任意线程获取任何UI对象(调用
InvokeOnMainThread
)?我无法控制UI代码。

我不知道第一个问题,但对于第二个问题“如何从任意线程获取任何UI对象(调用InvokeOnMainThread)”,这个问题如何

new NSObject().InvokeOnMainThread(()=>{
//调用特定于UI的东西
});
可以全局或本地禁用UI线程检查。后面的(本地)选项似乎适合您的需要

下面的代码将关闭检查,获取边界并重新启用检查(如果以前已启用)


成功了!如果我不在MainScreen上执行任何操作,而是读取
Bounds
,那么它是线程安全的吗?它不是线程安全的,但是如果您在调用
UIApplication.Main()
之前执行此操作,那么您很可能(如果您没有创建一些线程)在主线程上-这将是UI线程(但我们的检查尚未初始化).谢谢你的解释。我确实是在主线上。但我想知道为什么读取(不改变)值是不安全的?我理解为什么(可能)
.MainWindow
get
不是线程安全的:我可以用它做各种事情。也许
main屏幕的
get
做了一些非线程安全的事情?一般的规则是UIKit不是线程安全的。您无法知道该值是如何初始化/计算的-因此如果有多个线程请求
边界
可能会中断(如果不受保护)。当Apple将方法记录为线程安全时,我们将它们标记为线程安全(并且不会引发异常)。谢谢!不知道NSObject有多聪明,不管创建方法如何,它都知道UI线程。
bool check_ui = UIApplication.CheckForIllegalCrossThreadCalls;
UIApplication.CheckForIllegalCrossThreadCall = false;
var screen_bounds = UIScreen.MainScreen.Bounds;
UIApplication.CheckForIllegalCrossThreadCalls = check_ui;