C#程序卡在myListView.Add(myListViewItem)

时间:2014-04-03 21:08:38

标签: c# .net listview delegates add

我试图在运行时将ListViewItem添加到现有的ListView。

我有一个在UI内部创建的Client对象,并与服务器通信,因此每当服务器通知客户端某些状态更改时,我都需要更新UI。

我已经使用代理/事件在两者之间进行通信,事情是我似乎无法更新UI状态,即使其他所有内容都正常通信。

我觉得特别奇怪的是,如果我在UI中放置一个按钮,当单击时,将ListViewItem添加到完全相同的ListView中,我可以用完全相同的代码完成它。

我检查了收到的数据和代码创建的ListViewItem,一切都很顺利,只是程序在到达应该将LVI添加到LV的部分时卡住了。

这里有一些相关的代码:

    public delegate void MyEventHandler(string uname, bool function);

    public partial Class ClientWindow: Form{

    public Client c;

        public ClientWindow() {

                c = new Client();
                c.notifyUI += new MyEventHandler(HandleSomethingHappened);
                InitializeComponent();
                initListView();
            }


                (...)

        void HandleSomethingHappened(string foo, bool op) {

           if (foo != c.username && op) {
               ListViewItem listViewItem = new ListViewItem(foo);
               listOnlineUsers.Items.Add(listViewItem);
           }
           else
               removeUserFromUL(foo);}

        }
}


[Serializable]
public class Client : MarshalByRefObject, IClient {
    public event MyEventHandler notifyUI;

(...)

void NotifyUI(string uname, bool op) {
        Console.WriteLine("notifying");
        if (notifyUI != null) {
            Console.WriteLine("not null");

            Delegate[] invkList = notifyUI.GetInvocationList();

            foreach (MyEventHandler handler in invkList) {
                try {
                    IAsyncResult ar = handler.BeginInvoke(uname, op, null, null);
                    Console.WriteLine("Invoking event handler");
                }
                catch (Exception e) {
                    notifyUI -= handler;
                }
            }
        }
}

任何帮助都将受到赞赏,因为我完全没有理由不去工作。

这可能是我想要的愚蠢。

1 个答案:

答案 0 :(得分:0)

WPF中的

我会使用Dispathcer.Invoke(()=>{/*update UI here*/});

但是在胜利形式中我相信它只是ListViewItem.Invoke(somedelgate,params);

msdn for invoke

这是另一个资源http://www.codeproject.com/Articles/17688/Updating-the-GUI-from-another-thread-made-easy

我认为你处于一个单独的线程的唯一原因是因为你涉及IAsyncResult。