Graphics.DrawImage是异步的吗?

时间:2010-06-14 08:16:27

标签: c# graphics compact-framework drawimage

我只是想知道,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设备上运行。

修改

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

好吧,DrawImage不是异步的。该框架不会自动使其异步。此外,.NET中的大多数异步操作都以'Begin'开头,只是fyi。

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

  • 告诉我们AccessViolationException从哪个行抛出?
  • 确保_bitmapSyncRoot已初始化?