委托给实例方法在运行时不能有 null Intermittent

Delegate to an instance method cannot have null Intermittent on runtime

我遇到了这个错误并且无法理解这个错误。 我使用 win form 和 .net 3.5。 问题是,这可以编译和断断续续。今天刚放映,所以我猜这种情况很少见(可能在 5000 运行 之后出现一次)。我想知道引发此错误的原因,以及任何可能的解决方法。 这是我如何实现代码的示例。

我的应用是多线程的,这个方法是单例的。


Exception type: System.ArgumentException
Exception message: Delegate to an instance method cannot have null 'this'.
Exception stack trace: 
   at System.MulticastDelegate.ThrowNullThisInDelegateToInstance()
   at System.MulticastDelegate.CtorClosed(Object target, IntPtr methodPtr)

  class Caller
  {
    private ClassA theA;
    public Caller()
    {
      theA = new ClassA();
    }

    public void button_click()
    {
      theA.Execute(false);
    }
    public void button2_click()
    {
      theA.Execute( true );
    }
  }

  interface IClassA
  {
    void ActionMinus();
  }
  class ClassA
  {
    public int VariableA = 0;
    public void Execute( bool wait )
    {
      ClassB instanceB = new ClassB( this );
      Thread thread = new Thread( instanceB.Action ) // error in here
      { 
        Name = "Executor",
        Priority = ThreadPriority.Highest
      };

      thread.Start();
      if( wait )
        thread.Join();
    }
    public void ActionMinus()
    {
      //someAction1
      VariableA -= 2;
      //someAction2
    }
  }

  class ClassB
  {
    private readonly ClassA instanceA;
    public ClassB( ClassA instance )
    {
      instanceA = instance;
    }
    public void Action()
    {
      //some other action3
      instanceA.VariableA += 5;
      //some other action4
      instanceA.ActionMinus();
      //some other action5
    }
  }

看起来对我有用。

你的程序的上下文是什么?

我写了一个简单的空 shell 包含您的代码,但程序将在线程启动之前结束。

我不得不添加一个 Console.ReadKey() 方法。

这是我使用的全部代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace DelegateToInstance {

  class Program {
    static void Main(string[] args) {
      var obj = new Caller();
      obj.button_click();
      Console.ReadKey();
    }
  }

  class Caller
  {
    private ClassA theA;
    public Caller()
    {
      theA = new ClassA();
    }

    public void button_click()
    {
      theA.Execute(false);
    }
    public void button2_click()
    {
      theA.Execute( true );
    }
  }

  interface IClassA
  {
    void ActionMinus();
  }

  class ClassA
  {
    public int VariableA = 0;
    public void Execute( bool wait )
    {
      ClassB instanceB = new ClassB(this);
      Thread thread = new Thread( instanceB.Action ) // error in here
      { 
        Name = "Executor",
        Priority = ThreadPriority.Highest
      };

      thread.Start();
      if( wait )
        thread.Join();
    }
    public void ActionMinus()
    {
      //someAction1
      VariableA -= 2;
      //someAction2
    }
  }

  class ClassB
  {
    private readonly ClassA instanceA;
    public ClassB( ClassA instance )
    {
      instanceA = instance;
    }
    public void Action()
    {
      //some other action3
      instanceA.VariableA += 5;
      //some other action4
      instanceA.ActionMinus();
      //some other action5
    }
  }

}

我讨厌反对者,所以我给你投了赞成票。