C# 由于异步回调,在(不存在的)文本框中追加文本时出错
我已经编写了一些工作非常好的代码:程序打开了一个与服务器的异步套接字,并在文本区域中写入服务器发送的任何内容 问题是,当我关闭表单时,我得到了很多错误,因为回调试图在文本区域中写入,显然,文本区域已经不存在了 以下是在textarea上写入的方法:C# 由于异步回调,在(不存在的)文本框中追加文本时出错,c#,winforms,C#,Winforms,我已经编写了一些工作非常好的代码:程序打开了一个与服务器的异步套接字,并在文本区域中写入服务器发送的任何内容 问题是,当我关闭表单时,我得到了很多错误,因为回调试图在文本区域中写入,显然,文本区域已经不存在了 以下是在textarea上写入的方法: private void appendText(string s) { if (InvokeRequired) { this.Invoke(new Action<string>(appendText), n
private void appendText(string s)
{
if (InvokeRequired)
{
this.Invoke(new Action<string>(appendText), new object[] { s });
return;
}
SocketStream.AppendText(s + "\r\n");
}
有没有办法防止这些错误的发生?
我已经尝试添加一个
if(SocketStream != null)
但是它似乎不起作用。在关闭
表单之前,您可以取消订阅回调事件吗
您可以使用-=
操作符,在窗体的关闭处理程序中执行此操作。当您关闭窗体时,您可能需要停止从异步套接字读取内容,以及停止向文本框写入内容。您需要有一些状态,一些布尔值,使所有进程停止。现在我不知道你的具体情况,但你可以考虑如下:
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
}
公共类表单
{
private bool _formClosing=false;//跟踪表单关闭
公共表格
{
this.FormClosing+=FormClosingHandler;
}
受保护的void FormClosingHandler(对象发送方,FormClosingEventArgs e)
{
_formClosing=true;
}
私有无效文本(字符串s)
{
if(\u formClosing)//如果表单正在关闭,我们不想再追加
返回;
如果(需要调用)
{
调用(新操作(appendText),新对象[]{s});
返回;
}
SocketStream.AppendText(s+“\r\n”);
}
//插座处理;同时检查是否关闭
}
您还需要对套接字进行相同的检查,以阻止它读取更多数据并优雅地处理套接字/连接。我在这里再次做了一些假设/猜测,但这可能会把你推向正确的方向。你的文本区是SocketStream
吗?抛出的确切异常是什么?我认为您希望关闭FormClose事件处理程序中的套接字,或者执行类似操作。是的,SocketStream是我的文本框。例外情况不是用英语写的,所以我不确定写出来会有什么帮助。。。但我猜这听起来像“错误,试图在不存在的对象上写入”
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
}