【问题标题】:C# Mono {new Bitmap("fileName");} Just hangs on OSXC# Mono {new Bitmap("fileName");} 只是挂在 OSX 上
【发布时间】:2012-02-24 00:19:07
【问题描述】:

当尝试使用单声道版本的 System.Drawing.Bitmap 对象在 OSX 10.7.3 上加载“.bmp”、“.png”或“.jpg”时,应用程序只会挂起。我没有收到任何错误,应用程序只是卡在 Bitmaps 构造函数上......

当我在 (Arch)Linux 或 Windows 上运行相同的代码时,一切正常。

public static void Main (string[] args)
{
    using (var bitmap = new Bitmap("/....../image.bmp"))
    {

    }

    Console.WriteLine ("Hello World!");// Never gets here...
}

如果我在调试模式下暂停应用程序,它会打开“反汇编”窗口并显示它卡在这一行:

call Status System.Drawing.GDIPlus:GdiplusStartup (UInt64, GdiplusStartupInput, GdiplusStartupOutput)

注意:在调试模式下暂停应用程序几次后,它“神奇地”在编写此代码时开始工作。我保证我没有更改任何代码。任何人都知道什么会导致“System.Drawing.GDIPlus”挂起,所以我知道如何避免它?是否有单声道编解码器设置文件或其他可能会搞砸的东西?

【问题讨论】:

  • 这个工作更好吗:var bitmap = Bitmap.FromFile("......../image.bmp")
  • 感知发帖时间,我已经转而使用 OSX 的本机 API(通过 MonoMac)来加载图像......似乎这样运行速度也更快。

标签: c# macos mono bitmap


【解决方案1】:

问题只是性能。它与您的代码无关;图像只是需要更长的时间来加载。
Mono 的 System.Drawing 实现只是一个 C# 包装器,有点不完整,并且没有(或不正确地)提供 System.Drawing 中的所有功能。它可能在 Windows 中运行良好,因为它使用本机 GDIPlus.dll,但在基于 unix 的系统中可能无法正常运行,因为它使用 Cairo 引擎。您可以找到更多信息here

【讨论】:

  • 是的,我刚刚搬到通过 MonoMac 使用本机 API。这样就不会再出现性能问题了。
  • user2057660 的解决方法对我来说已经解决了这个问题,这很奇怪,而且除了明显的 CPU 消耗之外,似乎与这与性能相关的前景相冲突。它似乎也永远挂起。
【解决方案2】:

在 10.10 上安装新的 Mono 3.8 时遇到同样的问题;但它消失了,可疑地是在我在挂起期间摔断后,在 GdiplusStartup() 中看到线程 #4。

可能与中断有关,或者 GdiplusStartup 在 OS X 上首次启动时需要很长时间,进行字体缓存或其他操作。

【讨论】:

  • 这个解决方法对我来说是成功的。在挂起期间,mono-sgen 使用了 99% 的 CPU。这很有效。
  • 我正式创造了术语“薛定谔的绞刑”来描述这个错误的性质。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 2015-02-24
  • 2011-12-09
  • 1970-01-01
相关资源
最近更新 更多