Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';我看不到无限循环_C#_Multithreading_Stack Overflow - Fatal编程技术网

C# Can';我看不到无限循环

C# Can';我看不到无限循环,c#,multithreading,stack-overflow,C#,Multithreading,Stack Overflow,因此,我正在处理一个自动更新服务器列表,该列表加载所有服务器ip:port组合并将它们显示到listview中。我在一个线程中完成所有这些,所以我需要调用我的控件来对它们执行操作。这是我的invoke方法 public void invoke(MethodInvoker m) { try { invoke(m); } catch {} } 这是我的更新线程方法: public void updater() { while (au

因此,我正在处理一个自动更新服务器列表,该列表加载所有服务器ip:port组合并将它们显示到listview中。我在一个线程中完成所有这些,所以我需要调用我的控件来对它们执行操作。这是我的invoke方法

    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);
        }
    }
有人知道它为什么这样做吗?我以前也做过这样的申请,没有遇到过这个问题。也许我错过了一些东西,但任何帮助都将被感激


谢谢。

这看起来像是一个无限递归调用,是否缺少结束条件

public void invoke(MethodInvoker m) 
{
   try { invoke(m); } catch {} 
}

这看起来像是一个无限递归调用,是否缺少结束条件

public void invoke(MethodInvoker m) 
{
   try { invoke(m); } catch {} 
}

您的
invoke
方法正在递归地调用自身,没有终止条件。您需要做的是检查控件是否需要在UI线程上调度操作,并适当地重新调用该方法

您应该在同一线程上创建的某些控件上使用该方法(这可能是将被更新的控件,也可能是父窗体;这并不重要):


不过,顺便说一句,像这样有一把空伞
catch
block是非常糟糕的做法。这样做实际上是忽略了任何可能发生的错误,不管它是否可以/应该被忽略。您应该只尝试捕获您知道如何处理的异常;否则,让它传播回堆栈,以使某些代码能够处理它。

您的
invoke
方法在没有终止条件的情况下递归调用自己。您需要做的是检查控件是否需要在UI线程上调度操作,并适当地重新调用该方法

您应该在同一线程上创建的某些控件上使用该方法(这可能是将被更新的控件,也可能是父窗体;这并不重要):


不过,顺便说一句,像这样有一把空伞
catch
block是非常糟糕的做法。这样做实际上是忽略了任何可能发生的错误,不管它是否可以/应该被忽略。您应该只尝试捕获您知道如何处理的异常;否则,让它传播回堆栈,以使某些代码能够处理它。

您需要将其更改为:

public void invoke(MethodInvoker m) 
{
   try { someControl.Invoke(m); } catch {} 
}

您需要将其更改为:

public void invoke(MethodInvoker m) 
{
   try { someControl.Invoke(m); } catch {} 
}

线程睡眠(5000)仅用于测试/演示,我希望如此?它在那里,因此不会在每次完成时更新。我使用它是因为它从服务器获取信息。这是个坏主意吗?
Thread.Sleep(5000)仅用于测试/演示,我希望如此?它在那里,因此不会在每次完成时更新。我使用它是因为它从服务器获取信息。这是一个坏主意吗?我将'someControl'更改为'list'(我的listview的名称)。它现在没有错误,但对listview也没有任何影响。嗯,
catch{}
在检测发生了什么方面没有多大帮助。不过,似乎我使用了错误的方法来清除listview。我将'someControl'更改为'list'(我的listview的名称)它现在没有出错,但对listview也没有任何作用。嗯,
catch{}
在检测发生了什么方面没有太大帮助。不过,我似乎使用了错误的方法来清除listview。没有“end condition missing”,这个递归没有任何作用。它不应该启动。没有“缺少结束条件”,这个递归没有任何作用。它永远不应该开始。