3

スレッドを使用しようとしており、GUI コントローラーが含まれているため、そのコントローラーを呼び出す必要がありましたが、この問題があります。コードのこの部分で非デリゲート型を呼び出すことはできません。

if (toolStripTextBox1.Text != "")
{
    if (RT[j].tabvalue.ToString() == tabControl1.Invoke(() =>
                                       { tabControl1.SelectedTab.Name; }))
    {
        RT[j].RitchT.Text = getH.getHtmlCode(toolStripTextBox1.Text);
    }
}

一方、これが機能している間

tabControl1.Invoke(
    () => { tabControl1.TabPages[R.RitchT.Name].Controls.Add(R.RitchT);
});

これは呼び出しクラスです

 public static class ControlExtensions
 {
    public static void Invoke(this Control control, Action action)
    {
        if (control.InvokeRequired)
            control.Invoke(new MethodInvoker(action), null);
        else
            action.Invoke();
    }
 }

どうすればこれを解決できますか?

4

1 に答える 1

3
  tabControl1.Invoke(() => { tabControl1.SelectedTab.Name; })

はい、それは正当な構文ではありません。Control.BeginInvoke() メソッドは、デリゲートを最初の引数として受け取ります。ラムダ式は暗黙的にデリゲートに変換されません。あなたが助けなければなりません。修理:

  tabControl1.Invoke(new Func<string>(() => { return tabControl1.SelectedTab.Name; }))

さらに問題が発生します。ワーカー スレッドで RichTextBox の Text プロパティを割り当てることはできません。そこでも BeginInvoke() を使用する必要があります。Text プロパティを読み取ることはできますが、それはかなり悪い考えです。ワーカー スレッドの実行中にユーザーが UI を操作し続けている間に変更される可能性があります。BackgroundWorker または Task を優先し、開始する前にワーカーに必要なデータを収集し、完了後にワーカーの結果で UI を更新する必要があります。

于 2013-10-20T13:12:39.427 に答える