3

このことを考慮:

void StartUpdate(DataRequest dataRequest)
{
    Task.Factory.StartNew(request => {... do something with "request" ...}, 
        dataRequest);
}

さて、私の質問:StartNewメソッドに2番目のパラメーターとして渡す代わりに、ラムダ式内でdataRequestを使用できますか?私の懸念は、そのメソッドが別のスレッドで実行されることであり、dataRequestがそこで使用されたときにその状態を維持するかどうかはわかりません。

4

3 に答える 3

6

はい、できます。
これはクロージャーと呼ばれます。これは非常に強力な機能です。

スレッドセーフ、またはその欠如は、違いはありません。
クロージャーを介してインスタンスを取得する場合StartNewでも、パラメーターを介してインスタンスを取得する場合でも、それは同じオブジェクトです。(それstructが、何とも言えない悪である場合を除いて)

于 2010-12-03T03:18:46.253 に答える
2

私も同じ問題を抱えていました。ラムダ式の代わりにアクションを使用します。

private void StartUpdate(DataRequest dataRequest)
{
    Action<DataRequest> pobjAction = new Action<DataRequest>(DoSomething);
    Task.Factory.StartNew(pobjAccion, dataRequest);
}


private void DoSomething(DataRequest dataRequest)
{
    Trace.WriteLine(dataRequest.ToString());
}
于 2011-03-22T20:16:55.670 に答える
1

あなたの質問に答えてください、あなたはそうすることができます、しかしそれはスレッドセーフではないかもしれません。私はThreadLocalを使って手助けすることを学びます。

デリゲートメソッド内でdataRequestを分離する必要があります。

ThreadLocal<DataRequest> tls = new ThreadLocal<DataRequest>();

Task.Factory.StartNew(request => {
   tls.Value = (DataRequest)stateObject;

   ///
}, dataRequest);

/ * C#のPro .NETParallelProgrammingから取得します*/

于 2010-12-03T03:32:41.217 に答える