Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Exception Handling - Fatal编程技术网

C# &引用;对象引用未设置为实例";使用委托时

C# &引用;对象引用未设置为实例";使用委托时,c#,multithreading,exception-handling,C#,Multithreading,Exception Handling,您好。我在.NET4.0中遇到了一个奇怪的问题。我正在从我的主窗体线程调用以下代码,并且在变量MainForm.NumberOFWindows(尽管它已初始化)上出现了“对象引用未设置为实例”异常,我无法解释原因。对我来说,真正奇怪的是,try-catch-exception子句也没有捕获异常。 有人能解释一下我的问题吗?为什么会发生异常,为什么try-catch子句不会捕获异常 try { MyThread = new Thread(delegate() {

您好。我在.NET4.0中遇到了一个奇怪的问题。我正在从我的主窗体线程调用以下代码,并且在变量MainForm.NumberOFWindows(尽管它已初始化)上出现了“对象引用未设置为实例”异常,我无法解释原因。对我来说,真正奇怪的是,try-catch-exception子句也没有捕获异常。 有人能解释一下我的问题吗?为什么会发生异常,为什么try-catch子句不会捕获异常

try
{
    MyThread = new Thread(delegate() 
    { 
        Notify.UserInput(this,ref MainForm.NumberOFWindows);
    });
}
catch (Exception ex)
{
   MessageBox.Show(ex.Message);
}
为什么try-catch条款没有抓住它

因为它发生在与try/catch块具有不同堆栈的不同线程中

为什么在初始化MainForm.NumberOFWindows后仍会发生异常

只是一个猜测,可能是因为您检查它是否在主线程中初始化,然后在新线程控制并尝试访问它之前以某种方式销毁它(线程创建需要一些时间)

为什么try-catch条款没有抓住它

如果需要这样做,必须像这样将try-catch块放入委托中

    MyThread = new Thread(delegate() 
    { 
         try
           {
           Notify.UserInput(this,ref MainForm.NumberOFWindows);
           }
           catch (Exception ex)
           {
            MessageBox.Show(ex.Message);
           }
    });

@MaxMommersteeg这应该达到什么目的
MyThread
可能是一个属性。try/catch无法捕获它,因为它没有在该点运行。运行MyThread的代码在哪里?要捕获错误,需要在delegated中放置一个try-catch。如果没有声明,那么代码甚至不会编译。显然是这样,因为这是一个运行时异常。MainForm也不应该从主线程之外的任何地方访问。线程中的异常处理:因此,如果我理解正确,那么我从委托中得到的异常实际上发生在另一个线程上,尽管我还没有调用MyThread.Start()函数,是吗?当您调用
MyThread.Start()
Ok时,它将在另一个线程中发生。谢谢。int变量MainForm.NumberOFWindows如何。如果我在委托之前打印变量,它会打印出一个值,即1。这里有什么问题?这是因为我试图通过首先引用MainForm来创建对变量的引用,还是您认为它是其他东西?委托之外的MainForm是什么并不重要。(您感兴趣的是MainForm,而不是NumberOfWindows字段,因为它是被销毁的MainForm,不再引用实例)。因为委托将在另一个上下文中调用,稍后将调用。在访问委托之前检查委托中的MainForm。