调用循环/崩溃

时间:2014-11-01 18:04:32

标签: c# multithreading winforms invoke

我想将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");

1 个答案:

答案 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(),所以我不确定它为什么存在,或者它是否与你的问题相关。