2 つのスレッドが同じリソースにアクセスするのを避けて、別のスレッドで実行したい関数があります。また、スレッドが現在実行されている場合は、そのスレッドを停止して新しいスレッドの実行を開始することを確認したいと思います。これは私が持っているものです:
volatile int threadCount = 0; // use it to know the number of threads being executed
private void DoWork(string text, Action OncallbackDone)
{
threadCount++;
var t = new Thread(new ThreadStart(() =>
{
lock (_lock) // make sure that this code is only accessed by one thread
{
if (threadCount > 1) // if a new thread got in here return and let the last one execute
{
threadCount--;
return;
}
// do some work in here
Thread.Sleep(1000);
OncallbackDone();
threadCount--;
}
}));
t.Start();
}
そのメソッドを 5 回起動すると、ロックが解放されるまですべてのスレッドがロックを待機します。ただし、最後のスレッドを確実に実行したいと思います。スレッドがロックの所有者になるのを待っているときに、ロックを所有する次のスレッドを特定するにはどうすればよいですか。スレッドを作成した順序でリソースを所有してもらいたい...
編集
私はこのアプリケーションを .net 4.0 で作成していません。私が達成しようとしていたことに言及していないことをお詫びします。大量のデータをフィルタリングするオートコンプリート コントロールを作成しています。結果をフィルタリングするたびにメイン ウィンドウをフリーズさせたくありません。また、ユーザーの種類に応じて結果をフィルタリングしたいと考えています。ユーザーが一度に 5 文字を入力すると、すべてのスレッドを停止したいので、最後のスレッドだけに関心があります。ロックはすべてのスレッドをブロックするため、作成した最後のスレッドが最初にロックを所有する場合があります。