看不到无限循环

时间:2012-07-18 06:40:54

标签: c# multithreading stack-overflow

所以我正在开发一个自动更新服务器列表,它加载所有服务器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);
        }
    }

有谁知道为什么这样做?我以前做过这样的应用程序并且没有遇到过这个问题。也许我错过了一些东西,但任何帮助都会受到赞赏。

感谢。

3 个答案:

答案 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阻挡是非常糟糕的做法。在这样做时,您基本上忽略了可能发生的任何可能的错误,无论是否可以/应该被忽略。您应该只尝试捕获您知道如何处理的异常;否则,让它将堆栈传播回一些可以处理它的代码。