【问题标题】:Error on passing parameterised method in C# thread [duplicate]在 C# 线程中传递参数化方法时出错 [重复]
【发布时间】:2016-04-05 07:32:23
【问题描述】:

我在 A 类中有一个方法,我想通过传递参数在 B 类中线程启动它。

class ClassA
{
  public void MethodA(string par1, int par2)
  {
    Console.WriteLine("Parameter " + par1 + " is passed with value " + par2);
  }
}

class ClassB
{
  public static void Main(string[] args)
  {
    ClassA obj = new ClassA();
    Thread workerThread = new Thread(new ParameterizedThreadStart(obj.MethodA));
    workerThread.Start("book",5);
  }
}

但是当我执行代码时它给了我一个错误 `

“MethodA”没有重载匹配委托 'System.Threading.ParameterizedThreadStart

有什么问题?

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    试试这个...

    void Main()
    {
        ClassA obj = new ClassA();
        Thread thread = new Thread(() => obj.MethodA("Param1", 2));
        thread.Start();
        thread.Join();
    }
    
    
    class ClassA
    {
        public void MethodA(string par1, int par2)
        {
            Console.WriteLine("Parameter " + par1 + " is passed with value " + par2);
        }
    }
    

    问题...

    正如其他人已经说过的,你的参数太多了......

    除此之外,您也没有等待线程完成它的操作。

    您在上面看到的称为 lambda 表达式,基本上是一个匿名函数,您可以通过多种方式组合它,上面只是一个示例。

    这是另一个...

    void Main()
    {
        ClassA obj = new ClassA();
        Thread thread = new Thread(()=> 
        {
            Console.WriteLine ("About to execute MethodA");
            obj.MethodA("test", 2);
            Console.WriteLine ("Executed Method A");
        });
        thread.Start();
        thread.Join();
    }
    
    
    class ClassA
    {
        public void MethodA(string par1, int par2)
        {
            Console.WriteLine("Parameter " + par1 + " is passed with value " + par2);
        }
    }
    

    如果您需要进一步的帮助,请告诉我

    【讨论】:

      【解决方案2】:

      ParameterizedThreadStart 只接受一个对象参数的方法:

      https://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart(v=vs.110).aspx

      【讨论】:

        【解决方案3】:

        这正是它所说的意思。 ParameterizedThreadStart 有一个签名,它采用对象类型的单个参数。 MethodA 有两个参数,一个字符串和一个整数。

        为您的参数定义一个结构并传递它。重写 MethodA 以期望一个参数,即结构。这会给你一个兼容的签名。

        并停止创建自己的线程。使用线程池。

        ThreadPool.QueueUserWorkItem((WaitCallback)((new { par1 = par1expr, par2 = par2expr }) => {
          //code that was once the body of MethodA
        }));
        

        【讨论】:

          【解决方案4】:

          如前所述,ParameterizedThreadStart 表示具有对象类型的单个参数的函数。但实际上你并不需要它。您可以使用 Lambda 表达式:

          class ClassA
          {
              public void MethodA(string par1, int par2)
              {
                  Console.WriteLine("Parameter " + par1 + " is passed with value " + par2);
              }
          }
          
          class ClassB
          {
              public static void Main(string[] args)
              {
                  ClassA obj = new ClassA();
                  Thread workerThread = new Thread(() => obj.MethodA("par1", 42));
                  workerThread.Start();
              }
          }
          

          【讨论】:

            【解决方案5】:

            ParameterizedThreadStart 表示具有object 类型的单个参数的函数。

            考虑创建一个包含两个参数作为属性的状态对象。然后您可以将状态对象传递给MethodAMethodA 可以根据需要将其解构为单独的字段。

            例如

            public void MethodA(object paramsThing)
            {
                var tuple = (Tuple<string, int>)paramsThing;
                var par1 = tuple.Item1;
                var par2 = tuple.Item2;
                // etc.
            }
            
            ...
            
            var workerThread = new Thread(new ParameterizedThreadStart(obj.MethodA));
            workerThread.Start(Tuple.Create("book",5));
            

            【讨论】:

            • 不要创建新线程。使用线程池。
            • 哎呀!已修复,谢谢史蒂夫。
            猜你喜欢
            • 2015-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-07
            • 2017-02-12
            • 2014-02-03
            相关资源
            最近更新 更多