0

私がやろうとしているのは、別のクラスからtextBox(この場合はtxtInit)を更新することだけです。UIスレッドがそれ自体をどのように変更する必要があるか、およびディスパッチャーの使用について多くのことを読んでいます。私はここで近くに見える答えを見つけました、しかし私はそれを私のために働かせることができませんでした...それはラインを使ってみると言いました:

MainForm.Dispatcher.Invoke(new Action(delegate() {MainForm.myInstance.txtInit.Text = "Text"};);

ServerSideクラスでは、MainFormのtxtInitテキストボックスに文字列を送信する必要があります。これですべてです。助けてくれてありがとう。

4

3 に答える 3

1

クラスはスレッドとは何の関係もありません(これが今のあなたの問題です)。各コントロールには、適切なスレッド同期を行うInvokeメソッドがあります。だからあなたはすることができます

MainForm.myInstance.txtInit.Invoke((sender, args) => (sender as TextBox).Text = "text");

パフォーマンスを向上させるために、Control.IsInvokeRequiredプロパティをテストできます(基本的に同じスレッドにいるかどうかがわかります)。

これを行う別の方法は、 SynchronizationContext.Currentからフォームのコンストラクターでキャプチャする必要があるUIスレッドのSynchronizationContextを使用して、実行することです。

syncContext.Send((obj) =>  MainForm.myInstance.txtInit.Text = "Text", null);
于 2012-04-18T13:31:12.010 に答える
1

おそらく、MainFormに文字列を渡すことができるパブリックメソッドを作成し、そのメソッドにテキストボックスのテキストを設定させるだけです。また、Invoke呼び出し(異なるスレッド)を使用する必要があるかどうかを制御できるため、他の領域でこれをコーディングすることを心配する必要はありません。メソッドを呼び出して文字列を渡すだけです。

次に例を示します。

 public partial class Form1 : Form
    {
        public delegate void UpdateText(string text);
        public Form1()
        {
            InitializeComponent();
        }
        public void SetTextBoxText(string text)
        {
            // Check to see if invoke required - (from another thread)
            if(textBox1.InvokeRequired)
            {
                textBox1.Invoke(new UpdateText(this.SetTextBoxText),

                    new object[]{text});
            }
            else
            {
                textBox1.Text = text;
            }
        }
    }
于 2012-04-18T13:41:08.363 に答える
0

私が正しく理解していれば、別のスレッドまたはいくつかの非同期イベントからWindowsフォーム要素にアクセスしたいようです。そのような場合、以下のリンクが役立つかもしれません。

  1. http://msdn.microsoft.com/en-us/library/ms171728.aspx

  2. 複数のワーカースレッド(.NET)からUIを更新する

  3. WindowsMo​​bileの別のスレッドからのフォーム要素の制御

于 2012-04-18T13:27:00.000 に答える