成功使用.NET class Screen
在 WinForms 应用程序的后台线程中,我想知道这是否是明确定义的行为。
我目前正在读取主屏幕的像素尺寸,例如:
var w = Screen.PrimaryScreen.Bounds.Width;
var h = Screen.PrimaryScreen.Bounds.Height;
我想知道的原因是 WinForms 类往往是 used from the foreground thread only ,而且我没有找到说明 Screen
类在后台线程中使用是否安全的文档。
所以我的问题是:
是否可以在后台线程中读取 Screen.PrimaryScreen.Bounds
属性?
更新 1:
请注意,我的问题不是关于线程安全的。它是关于从后台线程访问 UI 元素。
例如使用 ILSpy我发现这些方法在内部使用 ReleaseDC
,当从后台线程调用时,可能 不允许或导致未定义的结果。
更新 2:
感谢您投反对票和标记以结束此问题。
我仍然认为这可能不是显而易见的,因为:
- 后台线程没有消息泵,
Screen
类可能需要一个。 - 该类位于 System.Windows.Forms 程序集中,这可能表明它需要特别注意。
最佳答案
您不能相信 .NET 线程安全文档,它只是复制/面食,只有在真正重要的时候才会修改。显示器最重要的特性是它不会在你身上跳来跳去。没有读-修改-写在起作用。
在线程中使用它很好,该类是 MonitorFromXxx() winapi 函数的非常薄包装器。底层 DeviceIoControl 调用始终是安全的,设备驱动程序需要让许多进程保持快乐。实际上,以有意义的方式使用结果,嗯,也许不是。
关于c# - 我可以在后台线程中使用 Screen 类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25813783/