2

このスレッド呼び出しを行うだけで、メソッド「DoSomething」にあるものは何でも起こり始めるという印象を受けましたが、明らかにそうではありませんでした。

この行を呼び出すと:

Task.Factory.StartNew(() => 
ControllerClass.DoSomething("data"), 
CancellationToken.None, 
TaskCreationOptions.LongRunning, TaskScheduler.Default);

ControllerClass.DoSomething("data") は実行されません。

ただし、待機を追加すると、メソッドが呼び出されます。

私が LongRunning オプションを使用している理由は、メソッドが実行を開始するときに特定のものが配置されていない場合に、メソッドが LongRunning になる可能性があるためです。そして、はい、メソッド自体はインラインで呼び出されたときに機能します。このスレッドがその処理を実行している間、メインプログラムが続行できるように、スレッド内にある必要があるだけです。

ちなみに、私もこの方法で呼び出してみましたが、同じ結果になりました。

 Task.Factory.StartNew(() =>
 ControllerClass.DoSomething("data")).ContinueWith
        (t =>
        {
            SendErrorEmail(t.Exception);
        }, TaskContinuationOptions.OnlyOnFaulted
        );

メソッド呼び出しの実行をすぐに開始するように指示するオプションがありませんか?

4

1 に答える 1

4

このスレッド呼び出しを行うだけで、メソッド「DoSomething」にあるものは何でも起こり始めるという印象を受けましたが、明らかにそうではありませんでした。

いいえ、これは起こっていません。実際、これを書くと:

Task.Factory.StartNew(() => 
    ControllerClass.DoSomething("data"), 
    CancellationToken.None, 
    TaskCreationOptions.LongRunning, TaskScheduler.Default);

カバーの下で、タスクはキューに入れられ、遅かれ早かれ のスレッドで実行されますThreadPool

MSDNによると:

StartNew を呼び出すことは、そのコンストラクターの 1 つを使用して Task を作成し、次に Start を呼び出して実行をスケジュールすることと機能的に同等です。

Ragarding あなたの他の声明:

ただし、待機を追加すると、メソッドが呼び出されます。

がオブジェクトをTaskFactory.StartNew返すため、これは真です。タスクTaskのメソッドを呼び出すときWait

現在のタスクの実行が開始されていない場合、Wait メソッドはタスクをスケジューラから削除し、現在のスレッドでインラインで実行しようとします。それができない場合、または現在のタスクが既に実行を開始している場合は、タスクが完了するまで呼び出しスレッドをブロックします。

簡単に言えばWaitブロッキングアクションです。

詳しくはこちらをご覧ください。

メソッド呼び出しの実行をすぐに開始するように指示するオプションがありませんか?

いいえ。待機を呼び出さない限り、私が知る限り、代替手段はありません。

于 2015-10-08T19:36:21.833 に答える