C# Graphics.DrawImage是否异步?

C# Graphics.DrawImage是否异步?,c#,graphics,compact-framework,drawimage,C#,Graphics,Compact Framework,Drawimage,我只是想知道,Graphics.DrawImage()是异步的吗? 我正在努力解决线程安全问题,无法找出问题所在 如果在GUI线程中使用以下代码: protected override void OnPaint(PaintEventArgs e) { lock (_bitmapSyncRoot) { e.Graphics.DrawImage(_bitmap, _xPos, _yPos); } } 并在单独的线程中包含以下代码: private void Redra

我只是想知道,
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);
}
这能解释accessviolation异常吗

该代码运行在具有compact framework 3.5的windows mobile 6.1设备上

编辑:


无论如何,当方法在同一线程中执行时也会发生这种情况。

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

我不确定您的错误来自何处,但您能:

  • 告诉我们AccessViolationException是从哪一行抛出的
  • 确保\u bitmapSyncRoot已初始化

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

    这篇文章可能会有一些启发:我知道“begin”方法,但我很确定不是所有异步方法都返回IAsyncResult?回答以下问题:-这是一个非托管异常,我的应用程序当场死亡,watson博士显示一个异常对话框。-是的,我初始化了SyncRoot对象谢谢你提供的信息。你能解释一下各种位图是如何在UI上使用的吗?可能是您对oldBitmap.Dispose()的调用导致了问题?另外,您确定正在从GUI线程调用OnPaint吗?您可以执行InvokeRequired检查以确定是否存在问题。位图是类似listview控件中的项。(每个项目1个位图)我在这里简化了代码,但是想法是为项目创建一个无效队列,这样一个单独的线程可以处理项目的重画。关于onpaint:我只调用Invalidate,所以onpaint由OS/CF处理。我在哪里创建图形对象?在代码注释//绘制位图中。CF在调用OnPaint()之前创建了一个。如果为True,请忘记这一点。绘图都发生在同一个线程中,因此这不应构成问题。我认为以下内容不应引发任何异常:Graphics.FromImage(…)、Graphics.Draw(…)、Graphics.Dispose()。对吗?我说的是创建图形对象,而不仅仅是使用它。我想说你已经证明了你无法做到这一点。msdn:Graphics.FromImage方法。从指定的图像创建新图形。我说的是创建一个图形对象:)