第二次打开表单后无法调用Invoke或BeginInvoke

时间:2013-03-30 20:15:33

标签: c# multithreading invoke

我有一个客户端/服务器系统,客户端在其上充当服务器的从属服务器。我的一个表单有一个listview,它由客户端上运行的进程填充。同一个表单只能打开一次,因为我第二次收到例外:InvalidOperationException Invoke or BeginInvoke cannot be called on a control until the window handle has been created.

表单构造函数:

public ProcessesForm(NetworkStream _stream)
{
    InitializeComponent();

    networkStream = _stream;

    //event on which the process list will be processed
    Server.OnProcessListingReceived += Server_OnProcessListingReceived;

    //request client for process list
    GetProcesses();

    this.ActiveControl = textBox1;
}

事件处理程序:

private void Server_OnProcessListingReceived(object sender,
                                             EventArgs.ProcessesEventArgs e)
{
    //exception is thrown here
    listView1.Invoke(new EventHandler(delegate { listView1.Items.Clear(); }));

    processes = new List<ProcessesEventArgs.Process>(e.Processes);

    foreach (var item in e.Processes)
    {
        ListViewItem lvi = new ListViewItem(item.Id);
        lvi.SubItems.Add(item.Name);
        lvi.SubItems.Add((Convert.ToInt64(item.Memory) / 1024).ToString());

        listView1.Invoke(new EventHandler(delegate { listView1.Items.Add(lvi); }));
    }
}

我正在调用listview,因为收到的列表处理是在相应的客户端线程上完成的。

正如我在帖子开头所说的那样,第一次打开表单时一切正常。

我已经尝试过:

  • 手动创建句柄
  • 取消分配OnProcessListingReceived个活动 在表格上关闭。
  • 其他不起作用的东西,我真的不能 召回。

造成这个问题的原因是什么?

编辑:

正如汉斯帕斯特所说的问题可能是thread race,但如果是这种情况不应该lock解决问题?我尝试实现锁定,但没有工作:

lock(listView1)
{
    listView1.Invoke(new EventHandler(delegate { listView1.Items.Clear(); }));
}

0 个答案:

没有答案