Wielowątkowość System.Windows.Graphics

Wiem oczywiście, że nie mogę wyciągnąć tego samegoGraphics obiekt z różnych wątków, ale czy to prawda, że ​​nie mogę go narysowaćróżne Graphics obiekty w różnych wątkach?

Rozważmy następujący program konsoli:

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();
        }
    }
}

Program tworzyBitmap w każdym wątku i kontynuuje losowanie elips na nim za pomocąGraphics obiekt, również generowany na wątek zBitmap.

Ze względu na wymóg budowania dla.net2 wielowątkowość jest implementowana za pomocąThreads iAutoResetEvents zamiast TPL.

Program wykonuje się bez zgłaszania wyjątku, alewykonuje się seryjnie. Za pomocąn wątki mnoży czas wykonania przezn i widać, że za pomocą menedżera zadań używa się tylko jednego rdzenia.

Ważne, aby to zauważyćnic z tego nie jest związane z żadnym elementem interfejsu użytkownika.

Co tu się dzieje? JestGraphics blokowanie obiektów na obiekcie statycznym?

questionAnswers(3)

yourAnswerToTheQuestion