0

多くのタスクを使用して、ラムダを介して2つ以上の変数を新しいスレッドに渡す必要がある場合があります。ラムダを使用するかどうかはわかりません。これらの変数は、スレッドのExecutionContextの一部として常に別のタスク/スレッドに渡されます。

Task<int> t = Task.Run(() => MyFunction(Var1, Var2, Var3), cts.Token);
4

2 に答える 2

3

安全とはどういう意味かを正確に説明していなかったので、質問はかなりあいまいです。

一般に、このような引数を渡すことは安全です(ただし、とは関係ありませんExecutionContext)。ただし、注意しなければならないことがいくつかあります。

まず、マルチスレッドの場合と同様に、複数のスレッドから同時に同じオブジェクトにアクセスする場合は注意が必要であり、そのためにロックを使用する必要があります。

次に、ラムダの通常のルールが適用されます。ラムダで使用される変数はクロージャを形成します。つまり、これらの変数への変更はラムダにも反映されます。

于 2013-02-25T18:21:36.977 に答える
1

私は個人的にタスクの経験はあまりありませんが、私がそれらで行ったことから、これは問題ではないはずです。関数を呼び出して引数を渡すと、これらの引数変数への参照が作成されるため、ガベージコレクションされません. 外側のスコープからいくつかの変数を使用しないように注意してください(この回答を確認してください)。

引数の数はそれほど重要ではありません。さらに重要なのは、別のスレッド内でそれらを使用する方法であり、メソッド引数のように渡すことは問題ありません。さらに引数を渡す方法がわからない場合は、この回答を参照してください。

マシュー・ワトソンが言及した閉鎖問題のシナリオは、次のようになります。

void Method(){
    var someVar = GetSomeVar();
    var t = Task.Run(() => { 
        // internal closure uses outer private variable
        DoSomething(someVar);
    });
    someVar = somethingElse;
}

免責事項:この答えは間違っているかもしれませんが、このコードは機能するかもしれませんが、あなたのコードには問題がないと思います:)

于 2013-02-25T12:57:38.710 に答える