代码之家  ›  专栏  ›  技术社区  ›  Roy

graphics.drawimage是异步的吗?

  •  3
  • Roy  · 技术社区  · 15 年前

    我只是想知道 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);
    }
    

    这能解释一个访问冲突异常吗?

    该代码运行在具有Compact Framework 3.5的Windows Mobile 6.1设备上。

    编辑:

    但是,当方法在同一线程中执行时,也会发生这种情况。

    2 回复  |  直到 15 年前
        1
  •  0
  •   Chad    15 年前

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

    我不知道你的错误来自哪里,但是你能:

    • 告诉我们accessViolationException是从哪一行抛出的?
    • 确保已初始化BitmapSyncRoot?
        2
  •  1
  •   Hans Passant    15 年前

    是的,是同步的。但是您在代码中做了更大的假设,您假设创建任何图形对象都是线程安全的。它在桌面版的gdi+上。在像wm这样的有限资源操作系统上不太可能出现这种情况。你不能锁定任何东西,用于绘画的东西是用你不能触摸的代码创建的。