私はマルチスレッドの基本的な cs を主に理解していますが、アプリケーションで単純なタイマー以外のことをする必要はありませんでした。マルチスレッドアプリケーションの操作方法を紹介し、基本を説明し、おそらくより難しいもののいくつかを提示する優れたリソースを知っている人はいますか?
5 に答える
これは、Joseph Albahari による優れた無料リソースです。C# でのスレッド化
2つの素晴らしい記事:
この記事はあなたが具体的に探しているものではありませんが、一般的に役立つことを願っています(つまり、関連していて、非常によく読んでいます)。
.Netでスレッドを同期する基本的な方法は4つあります。
- BackgroundWorkerコントロール
- WaitHandles
- コールバック関数
- ASyncResultオブジェクトのポーリング
一般的には、そのリストの一番上から始めて、下に向かっていきます。つまり、最初に、バックグラウンドワーカーのコントロールが状況に適しているかどうかを確認してください。ただし、ほとんどの場合、Windowsフォームを想定しており、新しいスレッドを1つだけ生成していることを前提としています。
次に、ウェイトハンドルを試してください。ウェイトハンドルは、複数のスレッドを一緒に調整するのに適しています。それらをすべてキックオフしてすべてが終了するのを待つことができます。または、特定の数をアクティブに保ちたい場合は、1つだけを待って、終了時に次の数をスポーンし続けます。または、1つのスレッドがはるかに早く終了することを知っている場合は、スレッドが終了するのを待って、少し作業を行ってから、残りのスレッドが終了するのを待つことができます。
たとえば、追加のスレッドを1つだけ生成し、それが完了するまでブロックしたくない場合、ウェイトハンドルは少し多く見えるかもしれません。次に、コールバックを使用して、指定した関数がスレッドの完了と同時に呼び出されるようにすることができます。
最後に、何らかの理由で上記のいずれも機能しない場合にのみ、ポーリングにフォールバックできます。
.Netで新しいスレッドを取得するための5つの異なる方法を、大まかに順番に考えることができます。
- 通常、winformsイベント(BackgoundWorkerを含む)の結果として作成されたOS。
- Obj.Begin ___()/ End ____()。特定のCLRクラスには、これらの非同期メソッドがすでに定義されており、使用可能な場合は明らかにそれらを使用する必要があります。
- ThreadPool.QueueUserWorkItem()。ほとんどの場合、これを使用して独自のスレッドを作成します。
- Delegate.BeginInvoke()/ EndInvoke()。この方法で任意のメソッドをラップできます。
- Thread.Start()。この方法でそれを行うこともできますが、最近、QueueUserWorkItemが機能しない場合は、デリゲートメソッドの方がおそらく優れているということを読みました(現在はリンクがありません)。
.NETのマルチスレッドについて学ぶための優れたWebリソース:
この件に関して私が知っている最高のリソースの 1 つは、「C# でのスレッド化」の本です: http://www.albahari.com/threading/
マルチスレッド アプリケーションをプログラミングするために .net 開発者が理解する必要があるすべての概要を説明しています。