Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 由于异步回调,在(不存在的)文本框中追加文本时出错_C#_Winforms - Fatal编程技术网

C# 由于异步回调,在(不存在的)文本框中追加文本时出错

C# 由于异步回调,在(不存在的)文本框中追加文本时出错,c#,winforms,C#,Winforms,我已经编写了一些工作非常好的代码:程序打开了一个与服务器的异步套接字,并在文本区域中写入服务器发送的任何内容 问题是,当我关闭表单时,我得到了很多错误,因为回调试图在文本区域中写入,显然,文本区域已经不存在了 以下是在textarea上写入的方法: private void appendText(string s) { if (InvokeRequired) { this.Invoke(new Action<string>(appendText), n

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

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

以下是在textarea上写入的方法:

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
}