マルチスレッドや のパワーを高く評価していないというわけではありませんがThreadPool、比較的単純なThreadPool. だから私はここに私のコードを提出して、私よりもはるかに賢い人々に分解してもらいます。
ここで何か間違ったことをしているのですか、それともこれまで期待していたよりもはるかに優れたマルチスレッドの候補ですか? (はい、この関数はスレッド全体です。先ほど言ったように、実行に 1 分以上かかっていました)
編集:私自身の質問に答えるには、いいえ、これは壊れています:複数回実行されているようですが、同じトリガーで実行されています。これは、ラムダの処理方法によるものですか?
private static void CompileEverything()
{
try
{
// maintain the state of our systray icon
object iconLock = new object();
bool iconIsOut = true;
// keep a count of how many threads are still running
object runCountLock = new object();
int threadRunning = 0;
foreach (World w in Worlds)
{
foreach (Trigger t in w.Triggers)
{
lock (runCountLock)
{
threadRunning++;
}
ThreadPool.QueueUserWorkItem(o =>
{
// [snip]: Do some work involving compiling code already in memory with CSharpCodeProvider
// provide some pretty feedback
lock (iconLock)
{
if (iconIsOut)
notifyIcon.Icon = Properties.Resources.Icon16in;
else
notifyIcon.Icon = Properties.Resources.Icon16out;
iconIsOut = !iconIsOut;
}
lock (runCountLock)
{
threadRunning--;
}
});
}
}
// wait for all the threads to finish up
while (true)
{
lock (runCountLock)
{
if (threadRunning == 0)
break;
}
}
// set the notification icon to our default icon.
notifyIcon.Icon = Properties.Resources.Icon16;
}
// we're going down before we finished starting...
// oh well, be nice about it.
catch (ThreadAbortException) { }
}