5

私はC#でこのコードを持っています:

Thread t1 = new Thread(functionsActivations(3, 4000, 0, 4));
Thread t2 = new Thread(functionsActivations(3, 4000, 5, 9));
t1.start();
t2.Start();
Thread t3 = new Thread(functionsActivations(4, 4000, 0, 4));
Thread t4 = new Thread(functionsActivations(4, 4000, 5, 9));

機能していません。与えたメソッドを呼び出すように指示するにはどうすればよいですか? 次に、t1 と t2 の実行が終了した後に t3 と t4 をアクティブにする必要があります。どうやってやるの?3 番目に、t1 と t2 をブロックしないようにします (これにより、t2 は t1 が終了するまで待機する必要がなくなります)。私がしたことは正しいですか?

4

1 に答える 1

4

「機能していない」というのは、明確な一連の症状ではありません。何を観察していますか?

EDIT:さて、コンパイラエラーが何であるかを述べたので、診断するのははるかに簡単です. 現在メソッドを呼び出しており、その結果をスレッドが実行するタスクとして使用しようとしています。スレッドの開始時に実際にそのメソッドを呼び出したいと仮定すると、次のようなものが必要になります。

C# 2:

Thread t1 = new Thread(delegate() { functionsActivations(3, 4000, 0, 4); });

C# 3:

Thread t1 = new Thread(() => functionsActivations(3, 4000, 0, 4));

あちこちにラムダ式を使用する代わりに、ユーティリティ メソッドを記述します。

private static Action DeferFunctionActivations(int a, int b, int c, int d)
{
    return () => functionsActivations(a, b, d, d);
}

次に、次を使用できます。

Thread t1 = new Thread(DeferFunctionActivations(3, 4000, 0, 4));

この投稿の残りの部分では、C# 3 を想定します。

さらに、次のようにt1.start()する必要がありますt1.Start()- C# では大文字と小文字が区別されます。

最後のポイントに答えるために、t1現在t2は独立しています-実行しているコードのどこかで同期をとらない限り、お互いをブロックすることはありません。

終了したときにのみ開始しt3たい場合は、次を使用できます。t4t1t2Thread.Join

Thread t1 = new Thread(() => functionsActivations(3, 4000, 0, 4));
Thread t2 = new Thread(() => functionsActivations(3, 4000, 5, 9));
t1.Start();
t2.Start();
t1.Join();
t2.Join();
Thread t3 = new Thread(() => functionsActivations(4, 4000, 0, 4));
Thread t4 = new Thread(() => functionsActivations(4, 4000, 5, 9));
t3.Start();
t4.Start();

これは、このスレッドも終了するまで待機しt1、終了することを意味することに注意してくださいt2。それが十分でない場合は、さまざまなオプションがありますが、基本的には、t1 と t2 が完了するのを非同期的に待機する別の方法が必要です。たとえば、それを行うために追加のスレッドを結び付けることができます。

Thread t1 = new Thread(() => functionsActivations(3, 4000, 0, 4));
Thread t2 = new Thread(() => functionsActivations(3, 4000, 5, 9));
t1.Start();
t2.Start();
Thread t3 = new Thread(() => functionsActivations(4, 4000, 0, 4));
Thread t4 = new Thread(() => functionsActivations(4, 4000, 5, 9));
Thread t5 = new Thread(() =>
{
    t1.Join();
    t2.Join();
    t3.Start();
    t4.Start();
});
t5.Start();

やや厄介ですが、動作するはずです。

.NET 4.0 は使用できますか? もしそうなら、Parallel Extensions フレームワークは、この多くを非常に簡単にします。

于 2010-02-12T13:15:56.003 に答える