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ąThread
s iAutoResetEvent
s 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?