由于异步回调,在(不存在)文本框中追加文本错误

本文关键字:文本 追加 错误 不存在 于异步 异步 回调 | 更新日期: 2023-09-27 18:14:57

我已经编写了一些工作得很好的代码:程序打开与服务器的异步套接字,并在服务器发送的文本区中写入任何内容。

问题是,当我关闭表单,我得到了很多错误,因为回调是试图写在文本区,显然,不再存在了。

这是在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)

由于异步回调,在(不存在)文本框中追加文本错误

当您关闭表单时,您可能需要停止从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
}

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

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

您可以使用-=操作符,在FormClosing处理程序中执行此操作。