我现在正忙着这一整天。
这就是我启动线程的方式
new Thread(() => MyFunction()).Start();
MyFunction()以这段代码结束,以更新GUI的listview:
Utilities.MainForm.Invoke(new Action(() =>
{
Utilities.MainForm.UpdateSearches();
}));
我也试过BeginInvoke
。
在MainForm的构造函数中,Utilities.MainForm设置为this
。它是我用来获取表单当前实例的Utilities的静态属性。
在UpdateSearches()中,我从我的数据库中检索新数据并像这样重新填充listview
lstSearches.Items.Clear();
lstSearches.Items.AddRange((ListViewItem[])listItems.ToArray(typeof(ListViewItem)));
我对下一步导致崩溃(ContextSwitchDeadLock)感到惊讶。
if (selectedIndex >= 0 && lstSearches.Items.Count > selectedIndex)
{
lstSearches.Items[selectedIndex].Selected = true;
//lstSearches.Select();
}
selectedIndex表示先前选择的lstSearches中的索引,并且索引DOES存在,我检查了它。您甚至可以将索引设置为0,如
lstSearches.Items[selectedIndex].Selected = true;
此行将始终使我的应用程序崩溃,通过调用调用时。
如果你在此之前返回,那么事情就会起作用,否则整个GUI会冻结等等。一旦我把Debugger.Break()
放在它之前并在Visual Studio中将Selected属性更改为true(我希望你知道我的意思,那就是你将一个对象悬停并打开一个窗口,您可以查看和设置属性/方法)。在那一刻,我将false改为true并按下了enter - 同样的事情发生了,一切都冻结了,最后我得到了一个ContextSwitchDeadLock。
这只发生在我的调用构造调用时,但奇怪的是,在上面的代码中操作表单控件没有问题。