我有一个客户端/服务器系统,客户端在其上充当服务器的从属服务器。我的一个表单有一个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(); }));
}