Multithreading-System.Windows.Graphics

Ich weiß natürlich, dass ich nicht auf dasselbe zurückgreifen kannGraphics Objekt aus verschiedenen Threads, aber es stimmt auch, dass ich nicht zeichnen kannanders Graphics Objekte in verschiedenen Threads?

Betrachten Sie das folgende Konsolenprogramm:

class Program
{
    static ThreadDrawer[] drawers;
    static void Main(string[] args)
    {
        int numThreads = 8;
        drawers = new ThreadDrawer[numThreads];
        for (int i = 0; i < numThreads; i++)
        {
            drawers[i] = new ThreadDrawer();
            drawers[i].Start();
        }
        for (int i = 0; i < numThreads; i++)
        {
            drawers[i].Wait();
        }
        Console.WriteLine("Complete.");
        Console.ReadKey();
    }

    class ThreadDrawer
    {
        private Thread thread;
        private AutoResetEvent resetEvent;

        public ThreadDrawer()
        {
            thread = new Thread(DrawRandomCircles);
            resetEvent = new AutoResetEvent(false);
        }

        public void Start()
        {
            thread.Start();
        }

        public void Wait()
        {
            resetEvent.WaitOne();
        }

        public void DrawRandomCircles()
        {
            Random r = new Random(Environment.TickCount);
            using (Bitmap b = new Bitmap(1000, 1000))
            using (Graphics g = Graphics.FromImage(b))
            {
                for (int i = 0; i < 100000; i++)
                {
                    g.DrawEllipse(Pens.Red, new Rectangle(r.Next(1000), r.Next(1000), 200, 200));
                }
            }
            resetEvent.Set();
        }
    }
}

Das Programm erstellt eineBitmap in jedem Thread und zeichnet zufällige Ellipsen mit aGraphics Objekt, das ebenfalls per Thread aus dem erzeugt wirdBitmap.

Aufgrund einer Anforderung zu bauen.net2 Das Multithreading wird mit implementiertThreads undAutoResetEvents anstelle von TPL.

Das Programm wird ohne Ausnahme ausgeführt, aberes wird seriell ausgeführt. Verwendenn Threads multipliziert die Ausführungszeit mitn und es ist klar, dass mit dem Task-Manager nur ein Kern verwendet wird.

Wichtig zu beachtenNichts davon ist an ein UI-Element gebunden.

Was geht hier vor sich? Ist derGraphics Objektverriegelung auf einem statischen Objekt?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage