我编写了一些非常有效的代码:程序打开服务器的异步套接字,并在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)
但它似乎没有用。
答案 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
运算符执行此操作。