1

我正在制作一个运行 2 个线程的 C# 程序。主 UI 线程和我自己制作的单独网络线程。

我发现,如果我需要从网络线程更改 UI 中的某些内容,我将需要调用一个 deligate 方法,它工作得很好:

// 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'”(当然用“int”代替“void”,并且在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;
    }

Called with a regular

int count = ReadListBoxIndex();
于 2012-07-26T08:38:15.737 回答
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 回答
0

This works also, where tn is the treenode you want added to cross thread and tnret is the treenode that is returned.

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

于 2015-05-29T15:28:37.650 回答