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を搭載したWindowsMo​​bile6.1デバイスで実行されています。

編集:

気にしないでください、それはメソッドが同じスレッドで実行されるときにも起こります。

4

2 に答える 2

1

ええ、同期しています。ただし、このコードでは、Graphicsオブジェクトの作成がスレッドセーフであると仮定して、より大きな仮定を行います。AfaikはGDI+のデスクトップバージョンにあります。WMのような限られたリソースのOSではそうはならないでしょう。ロックできるものはありません。ペイントに使用されるものは、触れられないコードで作成されています。

于 2010-06-14T08:35:35.397 に答える
0

まあ、DrawImageは非同期ではありません。フレームワークは自動的に非同期にしません。また、.NETのほとんどすべての非同期操作は、「Begin」で始まります。

エラーがどこから来ているのかわかりませんが、次のことができます。

  • AccessViolationExceptionがスローされる行を教えてください。
  • _bitmapSyncRootが初期化されていることを確認しますか?
于 2010-06-14T08:25:02.953 に答える