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方法。从指定的图像创建新图形。我说的是创建一个图形对象:)