私はいくつかの操作を行うメインクラスとソケットを使ってサーバーと通信する別のクラスを持っています。別のスレッドでクラス操作を開始する
ソケットクラスのオブジェクトを次のように作成すると、ソケットクラスのすべての操作が別のスレッドで実行されますか?
await Task.Run(()=>socketObj.initializeSocket());
別のスレッドでクラスを起動する別の方法がありますか?
私はいくつかの操作を行うメインクラスとソケットを使ってサーバーと通信する別のクラスを持っています。別のスレッドでクラス操作を開始する
ソケットクラスのオブジェクトを次のように作成すると、ソケットクラスのすべての操作が別のスレッドで実行されますか?
await Task.Run(()=>socketObj.initializeSocket());
別のスレッドでクラスを起動する別の方法がありますか?
タスク並列ライブラリ(TPL)は、多くの実行時ヒューリスティックを使用して、非同期メソッドの実行をスケジュールする際に意思決定を行います。 別のスレッド(これは本質的にCLRのスレッドプールからのスレッドです)で常に起動されるという保証はありません。 awaitキーワードを使用すると、本質的にあなたのメインスレッドがブロックされ、さらに進める前にinitializeSocket
関数が終了するのを待つ以外の有用な作業はできません。特に、ソケットの初期化が本当に短い時間がかかる場合、TPLは内部のタスクスケジューラでスケジューリングするのではなく、メインのアプリケーションスレッドを使いたいかもしれません。私はいくつかの類似した疑い、数ヶ月前に持っていたし、このスレッドには役立つかもしれない:ここ
詳細:
Is Task.Factory.StartNew() guaranteed to use another thread than the calling thread?
が他のTPLのAPIを心配しないでください がするのではなく、これらのスレッドで議論されていますあなたの場合はTask.Run
です。タスクは、それを作成するAPIに関係なく、すべてのタスクです。タスクスケジューラヒューリスティックのほとんどは、TPLの世界に参入すると変わりません。
ソケットクラスのオブジェクトを次のように作成すると、ソケットクラス内のすべての操作が別のスレッドで実行されますか?
号
それとも別のスレッドでクラスを起動する別の方法は何ですか?
「クラスを起動する」とはどういう意味ですか。
現在のコードでは、スレッドプールスレッドでinitializeSocket
が呼び出されます。 socketObj
の他のすべてのメソッドがスレッドプールスレッド上で実行されるわけではありません。
はいいいえ。 –
*「ソケットクラスのすべての操作」*とはどういう意味ですか?これは 'initializeSocket'を作り、そのメソッドの中で呼び出されたものは別のスレッド上で実行されます。 –
@MattBurlandソケットクラスにはConnect()、SendAndReceive()などのメソッドがあります。これらのメソッドを呼び出すと、別のスレッドで処理されますか? – Illuminati0x5B