【问题标题】:"object reference not set to an instance" when using delegate [duplicate]使用委托时“对象引用未设置为实例”[重复]
【发布时间】:2014-03-26 11:14:24
【问题描述】:

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

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

【问题讨论】:

  • @MaxMommersteeg 那应该达到什么目的? MyThread 大概是一个属性。
  • try/catch 不会捕获它,因为它当时没有运行。运行 MyThread 的代码在哪里?
  • 要捕获错误,您需要在委托中放置一个 try catch
  • 如果没有声明,那么代码甚至不会编译。它显然是这样做的,因为这是一个运行时异常。
  • MainForm 也不应该从除主线程之外的任何地方访问。

标签: c# multithreading exception-handling


【解决方案1】:

为什么它没有被 try catch 子句捕获?

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

为什么初始化了 MainForm.NumberOFWindows 还是会出现异常?

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

【讨论】:

  • 线程中的异常处理:stackoverflow.com/questions/1554181/…
  • 所以如果我理解正确的话,我从委托中得到的异常实际上是在另一个线程上发生的,虽然我还没有调用 MyThread.Start() 函数,是吗?
  • 调用MyThread.Start()时会发生在另一个线程中
  • 好的,谢谢。 int 变量 MainForm.NumberOFWindows 怎么样。如果我在委托之前打印变量,它会打印出一个值,即 1。这里有什么问题?是因为我尝试通过首先引用 MainForm 来创建对变量的引用,还是你认为它是别的东西?
  • 委托之外的 MainForm 无关紧要。 (您对 MainForm 感兴趣,而不是 NumberOfWindows 字段,因为 MainForm 已被销毁并且不再引用实例)。因为委托将在另一个上下文和稍后被调用。在访问委托之前检查 MainForm in
【解决方案2】:

为什么它没有被 try catch 子句捕获?

如果你想要这个,你必须像这样将 try catch 块放入委托中

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2016-10-27
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多