由于异步回调,在(不存在)文本框中追加文本错误
本文关键字:文本 追加 错误 不存在 于异步 异步 回调 | 更新日期: 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
之前取消订阅回调事件吗?
您可以使用-=
操作符,在Form
的Closing
处理程序中执行此操作。