4

我只是想知道,是Graphics.DrawImage()异步的吗?我正在努力解决线程安全问题,无法弄清楚问题出在哪里。

如果我在 GUI 线程中使用以下代码:

protected override void OnPaint(PaintEventArgs e)
{
   lock (_bitmapSyncRoot)
   {
      e.Graphics.DrawImage(_bitmap, _xPos, _yPos);
   }
}

并在一个单独的线程中有以下代码:

private void RedrawBitmapThread()
{
   Bitmap newBitmap = new Bitmap(_width, _height);
   // Draw bitmap //

   Bitmap oldBitmap = null;
   lock (_bitmapSyncRoot)
   {
      oldBitmap = _bitmap;
      _bitmap = newBitmap;
   }
   if (oldBitmap != null)
   {
      oldBitmap.Dispose();
   }
   Invoke(Invalidate);
}

这可以解释访问冲突异常吗?

该代码在具有紧凑框架 3.5 的 windows mobile 6.1 设备上运行。

编辑:

没关系,当方法在同一个线程中执行时也会发生这种情况..

4

2 回答 2

1

是的,是同步的。但是你在这段代码中做了更大的假设,你假设创建任何 Graphics 对象都是线程安全的。Afaik 它位于 GDI+ 的桌面版本上。在 WM 等资源有限的操作系统上不太可能发生这种情况。没有什么是你可以锁定的,用于绘画的那个是用你无法触摸的代码创建的。

于 2010-06-14T08:35:35.397 回答
0

好吧,DrawImage 不是异步的。该框架不会自动使其异步。此外,.NET 中的大多数异步操作都以“开始”开头,仅供参考。

我不确定您的错误来自哪里,但是您可以:

  • 告诉我们 AccessViolationException 是从哪一行抛出的?
  • 确保 _bitmapSyncRoot 已初始化?
于 2010-06-14T08:25:02.953 回答