所以我正在开发一个自动更新服务器列表,它加载所有服务器ip:端口组合并将它们显示在列表视图中。我在一个线程中做了所有这些,所以我需要调用我的控件来为它们做事。这是我的调用方法..
public void invoke(MethodInvoker m) {
try { invoke(m); } catch {}
}
这是我的更新线程方法:
public void updater()
{
while (autoUpdate)
{
reader = new StreamReader("servers.list");
servers = reader.ReadToEnd().Split('\n');
reader.Close();
invoke(new MethodInvoker(delegate { list.Clear(); }));
foreach (String s in servers)
{
String[] part = new String[] { s };
invoke(new MethodInvoker(delegate { list.Items.Add("Server Name").SubItems.AddRange(part); }));
}
Thread.Sleep(5000);
}
}
有谁知道为什么这样做?我以前做过这样的应用程序并且没有遇到过这个问题。也许我错过了一些东西,但任何帮助都会受到赞赏。
感谢。
答案 0 :(得分:4)
这看起来像无限递归调用,结束条件丢失了?
public void invoke(MethodInvoker m)
{
try { invoke(m); } catch {}
}
答案 1 :(得分:2)
您需要将其更改为:
public void invoke(MethodInvoker m)
{
try { someControl.Invoke(m); } catch {}
}
答案 2 :(得分:1)
您的invoke
方法在没有终止条件的情况下递归调用自身。您需要做的是检查控件是否要求在UI线程上调度操作,并适当地重新调用该方法。
你应该在同一个线程上创建的某个控件上使用Invoke
方法(这可能是将要更新的控件,或者它可能是父窗体;它并不重要):
public void invoke(MethodInvoker m)
{
try { this.Invoke(m); } catch {}
}
但是,作为旁注,这样的空伞catch
阻挡是非常糟糕的做法。在这样做时,您基本上忽略了可能发生的任何可能的错误,无论是否可以/应该被忽略。您应该只尝试捕获您知道如何处理的异常;否则,让它将堆栈传播回一些可以处理它的代码。