由于异步回调而在(不存在)文本框中附加文本时出错

时间:2013-05-22 17:05:51

标签: c# winforms

我编写了一些非常有效的代码:程序打开服务器的异步套接字,并在textarea中写入服务器发送的内容。

问题是,当我关闭表单时,我会收到很多错误,因为回调试图在textarea中写入,显然已经不存在了。

这是在textarea上写的方法:

private void appendText(string s)
{
    if (InvokeRequired)
    {
        this.Invoke(new Action<string>(appendText), new object[] { s });
        return;
    }

    SocketStream.AppendText(s + "\r\n");
}

这是调用所述方法的回调代码的一部分:

string[] arr = txt.Split(new char[1]);

foreach (string t in arr)
{
    if (!String.IsNullOrEmpty(t) && !String.IsNullOrWhiteSpace(t))
    {
        appendText( t);
    }  
}

有没有办法防止这些错误发生? 我已经尝试过添加

if(SocketStream != null)

但它似乎没有用。

2 个答案:

答案 0 :(得分:1)

当您关闭表单时,可能需要停止从异步套接字读取,以及停止写入TextBox。你可能需要一些状态,一些布尔值,这会使所有进程停止。现在我不知道你的具体情况,但你可以想到这样的事情:

public class YourForm
{
    private bool _formClosing = false; // Keep track of form closing

    public YourForm()
    {    
        this.FormClosing += FormClosingHandler;
    }

    protected void FormClosingHandler(object sender, FormClosingEventArgs e)
    {
        _formClosing = true;
    }

    private void appendText(string s)
    {
      if (_formClosing) // If form is closing, we dont want to append anymore
        return;

      if (InvokeRequired)
      {
          this.Invoke(new Action<string>(appendText), new object[] { s });
          return;
      }

      SocketStream.AppendText(s + "\r\n");
    }

    // Socket handling; also check for _formClosing
}

您还需要为套接字包含相同的检查,以阻止它读取更多数据并正常处理套接字/连接。我在这里做了一些假设/猜测,但这可能会让你朝着正确的方向前进。

答案 1 :(得分:0)

您可以在关闭Form之前取消订阅回拨事件吗?

您可以在-=的{​​{1}}处理程序中使用Closing运算符执行此操作。