代码之家  ›  专栏  ›  技术社区  ›  FosterZ

创建新的a thread()正在将参数化的threadstart对象作为c sharp中的参数进行请求

c#
  •  1
  • FosterZ  · 技术社区  · 14 年前

    啊,我对线程编程非常熟悉,刚开始创建多个线程的基本步骤,所以我在谷歌上搜索并获得了一些关于在C中创建线程的片段,以下是我发现的片段:

    public MyThread(string name) { 
        count = 0; 
        thrd = new Thread(new ThreadStart(this.run)); // here m getting error
        thrd.Name = name; 
        thrd.Start(); 
      } 
    
      // Entry point of thread. 
      void run() { 
        Console.WriteLine(thrd.Name + " starting."); 
    
        do { 
          Thread.Sleep(500); 
          Console.WriteLine("In " + thrd.Name + 
                            ", count is " + count); 
          count++; 
        } while(count < 10); 
    
        Console.WriteLine(thrd.Name + " terminating."); 
      } 
    } 
    

    错误是 与System.Threading.Thread.Thread(System.Threading.ParameterizedThreadStart)匹配的最佳重载方法具有一些无效参数

    为什么线程构造函数要求我提供参数化的threadstart对象,我希望传递简单的threadstart对象。

    另一件事是threadstart类没有带1个参数的构造函数,即它需要0个参数,但在代码片段中,它们显示了 new ThreadStart(this.run) 这个? M使用Cα2008

    这是完整的代码

    using System; 
    using System.Threading; 
    
    class MyThread { 
      public int count; 
      public Thread thrd; 
    
      public MyThread(string name) { 
        count = 0; 
        thrd = new Thread(new ThreadStart(this.run)); 
        thrd.Name = name; 
        thrd.Start(); 
      } 
    
      // Entry point of thread. 
      void run() { 
        Console.WriteLine(thrd.Name + " starting."); 
    
        do { 
          Thread.Sleep(500); 
          Console.WriteLine("In " + thrd.Name + 
                            ", count is " + count); 
          count++; 
        } while(count 
    
    3 回复  |  直到 14 年前
        1
  •  2
  •   Thomas Levesque    14 年前

    不知道为什么它不起作用,但你可以尝试一下:

    thrd = new Thread(run);
    

    转换自 run 方法组到 ThreadStart 委托是隐式的。

    我怀疑你之间有名字冲突 System.Threading.ThreadStart 以及在代码中其他地方定义的另一个类型…尝试插入插入符号 委托 按F12进入申报

        2
  •  2
  •   Dennis    14 年前

    我已经完成了您给出的不完整的示例,并且没有遇到相同的编译器错误。

    class Program
    {
        static int count;
        static Thread thrd;
    
    
        public static void MyThread(string name) { 
            count = 0; 
            thrd = new Thread(new ThreadStart(run)); // here m getting error
            thrd.Name = name; 
            thrd.Start(); 
        } 
    
      // Entry point of thread. 
      static void  run() { 
        Console.WriteLine(thrd.Name + " starting.");
    
        do
        {
            Thread.Sleep(500);
            Console.WriteLine("In " + thrd.Name +
                              ", count is " + count);
            count++;
        } while (count == 5);
      }
    
    
    
      static void Main(string[] args)
      {
      }
    }
    
        3
  •  2
  •   Jon Skeet    14 年前

    那应该很好,因为 an overload ThreadStart 而不是 ParameterizedThreadStart .

    我怀疑这里还有别的东西在玩…你能提供一个短的但是 完成 演示问题的示例?

    除了缺少类声明本身和变量声明之外,您的代码还为我编译,没有问题:

    using System;
    using System.Threading;
    
    class MyThread {
    
        int count;
        Thread thrd;
    
        public MyThread(string name) { 
            count = 0; 
            thrd = new Thread(new ThreadStart(this.run)); // here m getting error
            thrd.Name = name; 
            thrd.Start(); 
        } 
    
        // Entry point of thread. 
        void run() { 
            Console.WriteLine(thrd.Name + " starting."); 
    
            do { 
                Thread.Sleep(500); 
                Console.WriteLine("In " + thrd.Name + 
                                  ", count is " + count); 
                count++; 
            } while(count < 10); 
    
            Console.WriteLine(thrd.Name + " terminating."); 
        } 
    }