2

我编写了一些运行良好的代码:程序打开一个与服务器的异步套接字,并将服务器发送的任何内容写入文本区域。

问题是,当我关闭表单时,我得到了很多错误,因为回调试图在 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)

但它似乎没有用。

4

2 回答 2

1

当您关闭表单时,您可能需要停止从 Async 套接字读取数据,并停止写入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
}

您还需要对您的套接字进行相同的检查,以阻止它读取更多数据并优雅地处理套接字/连接。我再次在这里做出一些假设/猜测,但这可能会将您推向正确的方向。

于 2013-05-22T17:38:18.240 回答
0

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

您可以-=Closing.Form

于 2013-05-22T17:11:27.443 回答