2017-01-06 13 views
3

私は、次のニーズを書くために、コンソールを得るためにブロックされる理由を知りたい:C#Task.Factory.StartNew Longrunning

Task.Factory.StartNew(() => Console.WriteLine("KO"), TaskCreationOptions.LongRunning); 

、これはそうではない:

new Thread(() => Console.WriteLine("KO")).Start(); 

C#5.0によると、​​は、タスクがプールスレッド(バックグラウンドスレッド)を使用しないようになっています。すなわち、通常のスレッドと同様にフォアグラウンドスレッドを使用する必要があります。 Console.Readlineまたはにする必要がありますしかし、Taskで、それは長時間走っているかどうかは関係ありません、私はいつもメインスレッドを何らかの方法でブロックする必要があります。

だから、良いはLongRunningまたはOnComplete()またはGetAwaiter()またはGetResult()または私は常に自分自身が実際に結果を得るために、メインスレッドをブロックする必要がある場合は、結果をレンダリングすることになっている他の機能は何ですか?

+0

*フォアグラウンドスレッドを使用する必要があることを意味する* [いいえ、それは必要ありません。](https://referencesource.microsoft.com/#mscorlib/system/threading/Tasks/ThreadPoolTask​​Scheduler.cs,61) – PetSerAl

答えて

2

あなたは未定義の動作に依存しています。それをしないでください。

タスクが機能するのを待つ必要はありません。何らかの方法で実際に完了したことを確認する唯一の方法です。上記のコードだけでコンソールアプリケーションを使用していると仮定します。スレッドが実際にConsole.WriteLine部分に到達するまでには、メインスレッドは停止しており、すべてのバックグラウンドスレッドがあります。 new Threadは、デフォルトでフォアグラウンドスレッドを作成します。これにより、「メイン」スレッドが終了したにもかかわらず、アプリケーション全体が終了するのを防ぐことができます。

タスクの背後にあるアイデア(実際には、あらゆる種類の非同期操作)は、同時リクエストを作成し、非同期操作のチェーンを構築できるようにすることです(通常は同期させる)。しかし、実際に実行可能なアプリケーションを実際に作成するには、まだ同期ポイントが必要です。タスクが完了する前にアプリケーションが終了した場合は、あまりにも悪いです。

タスクが完了するのを待つ代わりにConsole.ReadLine明示的に - 実行のメインスレッドとは独立して、バックグラウンドで実行されますが、完了するのに十分な時間を与えます。ほとんどのアプリケーションでは、非同期操作を非同期に行うと、メインスレッドに対してが表示されます。たとえば、ボタンをクリックした結果がUIをブロックしない非同期のHTTP要求である可能性がありますが、終了しました。

+0

こんにちはLuaan、それをクリアしていただきありがとうございます。私はちょうど "LongRunning"は、タスクをバックグラウンドスレッドからフォアグラウンドスレッドにシフトさせることになっていて、通常のスレッドと同様にアプリケーションが終了しないようにすると考えていました。しかし、私はあなたのアプリケーションがタスクの前に出ていることについてあなたが言ったことを理解しています。私は決してその結果を知ることができないので、結果が得られるまで明示的に脅威をブロックするのがベストでしょう。私はOnCompleted()が私のためにそれをするはずだったという印象を受けていたので、何かが間違っていると思った。 – AndrewH

+0

@AndrewHタスクスケジューラのヒントは、純粋なCPUタスクではないことです。通常、スレッドプールからスレッドが割り当てられていないことを意味します。しかし、新しいスレッドはまだバックグラウンドスレッドであり、スレッドプールスレッドとは完全に直交しています。任意のスレッドはフォアグラウンドまたはバックグラウンドにすることができます。フォアグラウンドスレッドはアプリケーション終了をブロックし、バックグラウンドスレッドは終了しません。しかし理想的には、スレッドが何をしているのかを明確にし、すべてが完了したときにアプリケーションを終了するだけです。あなたはもはやUIを持っていないが、ただ死なないアプリが好きですか?これは一般的な原因です:) – Luaan

+0

ヘルプLuaanありがとう!とても有難い。 – AndrewH

関連する問題