从另一个线程

时间:2016-11-10 15:19:09

标签: c# multithreading invoke

我现在正忙着这一整天。

这就是我启动线程的方式

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。

这只发生在我的调用构造调用时,但奇怪的是,在上面的代码中操作表单控件没有问题。

0 个答案:

没有答案