0
for (APCounter = start; APCounter < Stager.InstructionsMemory.Length; APCounter++)
{
    PipelineInitializor();
    int i1 = APCounter;
    int i = APCounter;
    tasks[i] = new BlockingCollection<Func<object>>();
    tasks[i].Add(() => Fetch(i1));
    tasks[i].Add(() => Decode(i1));
    tasks[i].Add(() => ALURes(i1));
    tasks[i].Add(() => Memory(i1));
    tasks[i].Add(() => WriteB(i1));
    InstructionThread[i] = new Thread(() => Worker(i1, tasks[i1]));
    InstructionThread[i1].Start();
}

これらは、同じ種類のデータ オブジェクトを運ぶが新しいタスク データを持つ新しいスレッドに置き換える必要がある 2 つのスレッドです。

メソッドを使用してみましたがAbort(これはお勧めしません)、すべての実行が停止し、どの関数を呼び出しても何も実行が再開されませんでした。

4

2 に答える 2

1

Task Parallel Library と Task クラスを使用することをお勧めします。これにはキャンセル機能があります。

スレッドを「置き換える」ことは意味がありません。新しいスレッドを開始して同じデータを処理できます。ただし、他のスレッド自体を停止する方法がない場合、確実に停止することはできません。

于 2012-05-03T22:06:50.597 に答える
0

おっしゃる通り、メソッド abort() はお勧めできません。無限ループの場合、中断せずにスレッドを停止するために使用されるブール値。

bool run = true;
Thread thread = new Thread(method);
thread.start();

private void method()
{
  while(run)
  {

  }
}

スレッドを停止するには、ブール値を false に設定するだけで、通常は後で (または別の方法で) 再起動できます。

于 2012-05-03T22:01:04.010 に答える