Многопоточность. Windows.Graphics

Я знаю конечно, что я не могу рисовать на том жеGraphics объект из разных потоков, но это также правда, что я не могу нарисоватьразные Graphics объекты в разных темах?

Рассмотрим следующую консольную программу:

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

Программа создаетBitmap в каждом потоке и продолжает рисовать случайные эллипсы на нем, используяGraphics объект, также сгенерированный на поток изBitmap.

В связи с требованием построить для.net2 многопоточность реализована с использованиемThreadс иAutoResetEventс вместо TPL.

Программа выполняется без исключения, ноон выполняется поочередно, С помощьюn потоки умножают время выполнения наn и с помощью диспетчера задач ясно видно, что используется только одно ядро.

Важно отметить, чтоничего из этого не привязано ни к одному элементу интерфейса.

Что здесь происходит? ЭтоGraphics блокировка объекта на статическом объекте?

Ответы на вопрос(3)

Ваш ответ на вопрос