在WinForms应用程序的后台线程中成功使用.NET class Screen
,我想知道这是明确定义的行为。
我目前正在阅读主屏幕的像素尺寸,如:
var w = Screen.PrimaryScreen.Bounds.Width;
var h = Screen.PrimaryScreen.Bounds.Height;
我之所以想知道WinForms类往往是used from the foreground thread only,我发现没有文档说明Screen
类是否可以安全地在后台线程中使用。< / p>
所以我的问题是:
在后台线程中读取Screen.PrimaryScreen.Bounds
属性是否可以?
更新1:
请注意我的问题不关于线程安全。它是关于从后台线程访问UI元素。
E.g。使用ILSpy我发现这些方法在内部使用ReleaseDC
,当从后台线程调用时,可能被禁止或导致未定义的结果。
更新2:
感谢downvoting和flagging关闭此问题。
我仍然认为这个可能不明显,因为:
Screen
类可能需要一个。答案 0 :(得分:4)
你不能相信.NET线程安全文档,它只是复制/意大利面,只有在真正重要时才被修改。监视器最重要的属性是它不会跳到你身上。播放时没有读 - 修改 - 写。
在一个线程中使用它很好,该类是一个围绕MonitorFromXxx()winapi函数的非常瘦包装器。底层的DeviceIoControl调用始终是安全的,设备驱动程序需要让许多进程保持高兴。实际上以有意义的方式使用结果,好吧,也许不是。