この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 22231|答える: 0

[通信] 詳細は.net/c# SynchronizationContextをご覧ください

[リンクをコピー]
掲載地 2018/03/15 11:51:07 | | | |
メインインターフェースの更新方法についての入門記事をたくさん読みましたが、ほとんどがControl.InvokeとControl.BeginInvokeを使っています。 これらは良い解決策ですが、2つの問題があります。

1. System.Windows.Formsを参照し、その後System.Windows.Formsを使用する必要があります

2. コード構造は比較的複雑です。 (実はこれも#1が原因です)

Microsoftはもう一つのより洗練されたソリューション、System.Threadingを提供しています。 SynchronizationContext。 ご覧の通り、Namesapce System.Windows.Formsには含まれていないので、BusinessLaryerやControler、さらにはモジュールでも正当に使えます。

そして非常に便利で、以下の2つの方法に集中すればよくなります。

1. 送信:メインスレッドにインターフェース更新リクエストを送信し、現在のスレッドが戻るまでブロックします。

2. 投稿:現在のスレッドをブロックせずにメインスレッドにインターフェース更新リクエストを送信します。

実際、これらはすべて同じ方法ですが、送信は同期、後処理は非同期です


Form1 form = new Form1()ができる前は、SynchronizationContextオブジェクトは空であり、Form1フォームがインスタンス化されるとSynchronizationContextオブジェクトがこのスレッドに追加されました。 つまり、Controlオブジェクトが作成されるときの答えは、、SynchronizationContextオブジェクトも作成され、スレッドに付加されます。 すべてはInitializeComponent(; これが完了すると、NULLでないオブジェクトを取得できます


最後に、SynchronizationContextのSendt()メソッドとPost()メソッドの違いについて:

Send()は、単に現在のスレッド上の代理を呼び出し(同期呼び出し)することで実装されます。 つまり、UIスレッドはサブスレッド上で直接呼び出しされて実行され、実行完了後もサブスレッドは実行を続けます。

Post()はスレッドプール上のデリゲートを呼び出し(非同期呼び出し)によって実装されます。 これは、サブスレッドがスレッドプールからスレッドを見つけてUIスレッドを調整し、サブスレッドがUIスレッドの完了を待たずに自分のコードを直接実行するためです。
テストコード:

結果:

UIメインスレッド:1
スレッド:5
SynchContext:1


概要:UIスレッド上のSynchronizationContextオブジェクトは、メインスレッドでもスレッド内で呼び出されてもメインスレッド上で実行されるため、時間のかかるコードが多いとUIインターフェースがフリーズしたり、フェイクダウンを起こしたりします

実際UIスレッドはSynchronizationContextクラスではなく、WindowsFormsSynchronizationContextを使用しますこのドンドン。





System.Threading.Synchronizationコンテキストソースコード:


WindowsFormsSynchronizationContext ソースコード:







先の:C#プログラムを最適化する47の方法
次に:.net/c# 上海パイ上海ブランドアシスタント[ソースコード付き]
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com