我想将Text写入文本框。为了能够从不同的线程做到这一点,我调用了一个静态方法,该方法调用一个持有调用和文本框写入的非静态方法。这样做的时候。我收到错误,它无法调用,直到设置了Windows句柄,所以我设置它。我的问题是,
的位置if (!this.IsHandleCreated)
this.CreateHandle();
代码中的是唯一一个我的程序没有崩溃的程序,但现在它只是循环(无条件地)循环启动代码,但实际上并不是下面的文本设置代码。我做错了什么?
代码:
private void ActualLog(string input)
{
var currentForm = form as Main;
if (!this.IsHandleCreated)
this.CreateHandle();
if (currentForm.txtServerLog.InvokeRequired)
{
this.BeginInvoke(new Action<string>(ActualLog), new object[] { input });
return;
}
else
{
currentForm.txtServerLog.Text += input + "\r\n";
currentForm.txtServerLog.Refresh();
}
}
public static void Log(string input)
{
Main main = new Main();
main.ActualLog(input);
}
从我的帖子中,我会打电话给Log("Any String");
答案 0 :(得分:1)
据我所知,你的无限循环是因为,只要txtServerLog的InvokeRequired为true,你就会调用一个Action,它将ActualLog作为一个动作。基本上,每次进入条件路径时,都会从ActualLog重新开始。想象一下,如果你拿出方法中的所有其他代码并且只是:
private void ActualLog(string input)
{
ActualLog(input);
}
我可能会在这里遗漏一些皱纹,但我很确定这正是你在这里所做的。鉴于在txtServerLog要求您调用命令的情况下,您不会做任何改变该状态的事情,您只需要永远循环。
你想要做的是将你实际尝试调用的函数分成一个单独的日志 - 我假设你的目标是更新TextBox。
所以,一个例子:
private void UpdateTextBox(string input)
{
currentForm.txtServerLog.Text += input + "\r\n";
currentForm.txtServerLog.Refresh();
}
和您的ActualLog功能:
private void ActualLog(string input)
{
var currentForm = form as Main;
if (!this.IsHandleCreated)
{
this.CreateHandle();
}
if (currentForm.txtServerLog.InvokeRequired)
{
this.Invoke(new Action<string>(UpdateTextBox), new object[] { input }); //Make sure to use Invoke, not BeginInvoke
return;
}
UpdateTextBox(input);
}
请记住,如果你返回if条件并且没有else-if,那么没有功能上的原因可以使用else分支 - 你可以在if块之后包含它们。
关于你传递的代码的一点 - 你实际上并没有在其中调用Log(),所以我不确定它为什么存在,或者它是否与你的问题相关。