Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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#_Multithreading_Winforms_Visual Studio - Fatal编程技术网

C# 无法使用多个线程访问已释放的对象

C# 无法使用多个线程访问已释放的对象,c#,multithreading,winforms,visual-studio,C#,Multithreading,Winforms,Visual Studio,每次关闭应用程序时,我都会遇到一个非常恼人的错误,错误告诉我: 无法访问已释放的对象 只有当我关闭应用程序时才会发生这种情况 这是发生错误的零件代码: /// <summary> /// Method that shows a log to the user, about what is happening behind scenes. /// </summary> /// <param name="logtext"></param> public

每次关闭应用程序时,我都会遇到一个非常恼人的错误,错误告诉我:

无法访问已释放的对象

只有当我关闭应用程序时才会发生这种情况

这是发生错误的零件代码:

/// <summary>
/// Method that shows a log to the user, about what is happening behind scenes.
/// </summary>
/// <param name="logtext"></param>
public void DisplayLog(string logtext)
{
    if (this.txtLog.InvokeRequired)
    {
        Invoke(new MethodInvoker(delegate()
            {
                txtLog.AppendText(logtext + "\n\n");
            }));
    }
    else
    {
        txtLog.AppendText(logtext + "\n\n");
    }
}
//
///方法,该方法向用户显示有关幕后发生的事情的日志。
/// 
/// 
公共void显示日志(字符串logtext)
{
if(this.txtLog.invokererequired)
{
调用(新的MethodInvoker(委托)()
{
txtLog.AppendText(logtext+“\n\n”);
}));
}
其他的
{
txtLog.AppendText(logtext+“\n\n”);
}
}
错误发生在else括号之间的
txtLog.AppendText
上。 它可能与我正在使用的线程有关,上面的代码不是在我创建的线程中运行的,只有windows窗体线程在后台运行以检查触发的事件,向此方法发送
logtext
的代码在另一个名为
Serial
的内部类中,然后它从一个线程运行,有人知道如何解决这个问题吗

提前谢谢

使用文本框之前,请检查其属性:

if (!txtLog.IsDisposed) {
    txtLog.AppendText(logtext + "\n\n");
}
在使用文本框之前,请检查其属性:

if (!txtLog.IsDisposed) {
    txtLog.AppendText(logtext + "\n\n");
}

txtLog
的实际类型是什么?
txtLog
的实际类型是什么?我不知道这样做是否正确,但它确实有效,谢谢。@Mobstaa Dispose只能在UI线程上调用,并且此代码也在UI线程上执行,因此应该没有争用条件。但是不要忘记在两次调用
AppendText
之前插入该检查。我不知道这是否是正确的方法,但它确实有效,谢谢。@Mobstaa Dispose只能在UI线程上调用,并且该代码也在UI线程上执行,因此不应该存在争用条件。但不要忘记在调用
AppendText
之前插入该检查。