我可以在后台线程中使用Screen类吗?

时间:2014-09-12 17:34:33

标签: c# .net winforms screen background-thread

在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类可能需要一个。
  • 该类存在于System.Windows.Forms程序集中,这可能表明需要特别注意。

1 个答案:

答案 0 :(得分:4)

你不能相信.NET线程安全文档,它只是复制/意大利面,只有在真正重要时才被修改。监视器最重要的属性是它不会跳到你身上。播放时没有读 - 修改 - 写。

在一个线程中使用它很好,该类是一个围绕MonitorFromXxx()winapi函数的非常瘦包装器。底层的DeviceIoControl调用始终是安全的,设备驱动程序需要让许多进程保持高兴。实际上以有意义的方式使用结果,好吧,也许不是。

相关问题