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 implementiertThread
s undAutoResetEvent
s 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?