C# Can';我看不到无限循环
因此,我正在处理一个自动更新服务器列表,该列表加载所有服务器ip:port组合并将它们显示到listview中。我在一个线程中完成所有这些,所以我需要调用我的控件来对它们执行操作。这是我的invoke方法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
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”,这个递归没有任何作用。它不应该启动。没有“缺少结束条件”,这个递归没有任何作用。它永远不应该开始。