应为C#方法名称

本文关键字:方法 应为 | 更新日期: 2023-09-27 18:20:08

我只是想传递一些值,但它总是抛出一个错误。有人能纠正我在这里遗漏了什么吗?

这里有错误

Thread t_PerthOut = new Thread(new ThreadStart(ReadCentralOutQueue("test"));

我想把这个字符串值传递给ReadCentralOutQueue

class Program
    {
        public void Main(string[] args)
        {
            Thread t_PerthOut = new Thread(new ThreadStart(ReadCentralOutQueue("test"));
            t_PerthOut.Start();
        }

        public void ReadCentralOutQueue(string strQueueName)
        {
            System.Messaging.MessageQueue mq;
            System.Messaging.Message mes;
            string m;
            while (true)
            {
                try
                {

                        }
                        else
                        {
                            Console.WriteLine("Waiting for " + strQueueName + " Queue.....");
                        }
                    }
                }
                catch
                {
                    m = "Exception Occured.";
                    Console.WriteLine(m);
                }
                finally
                {
                    //Console.ReadLine();
                }
            }
        }
    }

应为C#方法名称

此代码:

Thread t_PerthOut = new Thread(new ThreadStart(ReadCentralOutQueue("test"));

尝试调用ReadCentralOutQueue,然后根据结果创建委托。这是行不通的,因为这是一种无效的方法。通常,您会使用方法组来创建委托,或者使用匿名函数(如lambda表达式)。在这种情况下,lambda表达式将是最简单的:

Thread t_PerthOut = new Thread(() => ReadCentralOutQueue("test"));

不能只使用new Thread(ReadCentralOutQueue),因为ReadCentralOutQueueThreadStartParameterizedThreadStart的签名不匹配。

重要的是,你要了解为什么你会得到这个错误,以及如何修复它。

编辑:为了证明确实有效,这里有一个简短但完整的程序:

using System;
using System.Threading;
class Program
{
    public static void Main(string[] args)
    {
        Thread thread = new Thread(() => ReadCentralOutQueue("test"));
        thread.Start();
        thread.Join();
    }
    public static void ReadCentralOutQueue(string queueName)
    {
        Console.WriteLine("I would read queue {0} here", queueName);
    }
}

你必须这样做:

var thread = new Thread(ReadCentralOutQueue);
thread.Start("test");

此外,ParameterizedThreadStart需要一个以object为参数的委托,因此您需要将签名更改为:

public static void ReadCentralOutQueue(object state)
{
    var queueName = state as string;
    ...
}

参数不允许作为ThreadStart委托的一部分。将参数传递给新线程还有其他几种解决方案,如下所述:http://www.yoda.arachsys.com/csharp/threads/parameters.shtml

但在您的情况下,可能最简单的方法是匿名方法:

ThreadStart starter = delegate { Fetch (myUrl); };
new Thread(starter).Start();