0

C# で次のコードを書きました。

private void myEnqThread()
        {
            Bitmap temp = null;
            temp = getScreen();
            if(temp!=null)
                queueScreen.Enqueue(temp);
        }

        private Bitmap getScreen(){
            System.Drawing.Bitmap bitmapDesktop;
            System.Drawing.Graphics graphics;
            System.IntPtr hWndForeground;// = System.IntPtr.Zero;

            RECT rect = new RECT();
            bitmapDesktop = null;
            graphics = null;
            hWndForeground = System.IntPtr.Zero;

            bitmapDesktop = new Bitmap
            (
                System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width,
                System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height,
                System.Drawing.Imaging.PixelFormat.Format24bppRgb
            );

            graphics = System.Drawing.Graphics.FromImage(bitmapDesktop);
            graphics.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size);
            hWndForeground = GetForegroundWindow();
            GetWindowRect(hWndForeground, out rect);
            graphics.DrawRectangle(Pens.Red, rect.Left, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top);
            return bitmapDesktop;
        }

メソッド myEnqThread() を実行した複数のスレッドが存在する可能性があります。次に例を示します。

Thread oThreadEnqueue = new Thread(new ThreadStart(myEnqThread));
oThreadEnqueue.Start();
Thread oThreadEnqueue2 = new Thread(new ThreadStart(myEnqThread));
oThreadEnqueue2.Start();

エラーが発生します:

ArgumentException not managed. 

エラーは次の画像に示されています。

画像

これは、複数のスレッドがその操作にアクセスしようとした場合にのみ発生すると思います。これは、1 つのスレッドのみを使用して同じコードを試したときに問題がないためです。

この問題を解決するにはどうすればよいですか? リソースをロックできますか?

編集:

@Oscar によって提案された変更後、これエラーが発生しました

4

1 に答える 1