0

フォームからラベルテキストを取得するための適切な「スレッドセーフ」な方法について、誰かが私にいくつかのアイデアを教えてくれますか? 現在、CrossThreadingMessaging 例外が発生しています。デリゲートを使用する必要があることはわかっていますが、これを正しく機能させるには問題があります。誰かが私に例を挙げてもらえますか? テキストを取得したいメインフォームにラベルがあります。別のクラスから呼び出しを行う必要があります。ここでのガイダンスは大歓迎です。

ロブ

これが私のシナリオです:

USB スケールから重量を取得し、この待機を DDE 呼び出しを介してレガシー システムに戻すアプリケーションを作成する必要があります。レガシ システムは、実行可能ファイルに対して DDE 呼び出しを行い、エミュレータ プログラムを介して重みを取得します。C# アプリケーションで古い VB 5 アプリケーションを模倣しようとしています。他にもやりたい方法はたくさんあると思いますが、経営陣からこの方法でやるように言われました。ラベル テキストの重みを取得しましたが、今度はメイン フォームのラベルから重みを取得し、DDE OnRequest メソッドの実行時にそれを返す必要があります。ここで CrossThreading 例外が発生します。OnRequest は、もちろんメイン フォーム クラスの外側のクラスにあります。

4

1 に答える 1

0

Label の Text プロパティのプロパティ getter の呼び出しは、通常取得する IllegalOperationException を呼び出さずに、スレッドから実行できます。これは実装の詳細です。Text プロパティの値は内部文字列にキャッシュされます。例えば:

    private void button1_Click(object sender, EventArgs e) {
        var t = new Thread(() => Console.WriteLine(label1.Text));
        t.Start();
    }

例外なし。しかし、Text プロパティを設定すると、確実にハンマーが呼び出されます。そうでなければ、この種のコードを使用することはお勧めできません。スレッドを使用して非 UI 関連の作業を実行し、スレッドを開始するときに必要なものを提供します。また、BackgroundWorker クラスを優先します。スレッド セーフな進行状況の更新とスレッド セーフな結果を提供すると非常に便利です。

于 2012-08-22T17:02:08.943 に答える