1

2 つのスレッドを実行する C# プログラムを作成しています。メインの UI スレッドと、別のネットワーク スレッドを自分で作成します。

ネットワーク スレッドから UI の何かを変更する必要がある場合は、デリゲート メソッドを呼び出す必要があることがわかりました。これは問題なく機能します。

// Declared as a global variable
public delegate void ListBoxFirst();

//Then call this from the network thread
listBox1.BeginInvoke(new ListBoxFirst(InitListBox));

//Which points to this
public void InitListBox() {
     listBox1.SelectedIndex = 0;
}

ここで、ネットワーク スレッドから UI 値 (listbox.selectedindex) を読み取れるようにする必要がありますが、同じ方法で試してみると、「型 'system.iasyncresult' を 'int' に暗黙的に変換できません」というエラーが表示されます (もちろん、「void」の代わりに「int」を使用し、listbox1.begininvoke の前に「int a =」を使用します)。私はたくさんグーグルで検索しましたが、C# にはかなり慣れていないので、本当に迷ってしまいます。

どんな助けでも大歓迎です

4

3 に答える 3

1

私はそれを考え出した:

public int ReadListBoxIndex()
    {
        int count = 0;
        listBox1.Invoke(new MethodInvoker(delegate
        {
            count = listBox1.SelectedIndex;
        }));
        return count;
    }

定期的に呼び出されます

int count = ReadListBoxIndex();
于 2012-07-26T08:38:15.737 に答える
0

これも機能tnします。クロススレッドに追加するツリーノードはどこにあり、tnret返されるツリーノードはどこにありますか。

_treeView.Invoke(new Action(() => tnret = tn.Nodes.Add( name, name )));

于 2015-05-29T15:28:37.650 に答える
0

EndInvoke()結果を取得するには、電話する必要があります。

いくつかのコード:

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            listBox1.Items.AddRange(new[] { "AS","Ram"});           
        }

        protected override void OnLoad(EventArgs e)
        {
            listBox1.BeginInvoke(new Action(GetResult));
        }

        private void GetResult()
        {
            if (InvokeRequired)
            {
                Invoke(new Action(GetResult));
            }
            listBox1.SelectedIndex = 0;
        }
    }
于 2012-07-25T22:09:08.327 に答える