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

标签 c# .net winforms screen background-thread

成功使用.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/

相关文章:

c# - 什么时候应该在 C# 方法名称中使用 "Try"?

c# - 在忘记密码过程中显示电子邮件地址是否安全?

javascript - 如何从 C# 绑定(bind)到 HTML?

.net - 确定停用表单时激活的去向

C# INotifyPropertyChanged 动态创建对象的属性?

c# - 将通用接口(interface)的实现分配给属性

.net - EF 4为什么不为具有唯一索引的列生成FK关系的关联?

c# - 什么是 C# 的 "moSTLy complete"(im) 可变性方法?

c# - WCF 的凭证委托(delegate)问题

c# - 如何刷新绑定(bind)到已更新的 Access 数据库表的 DataGridView?