预期C#方法名称

时间:2012-01-11 04:09:21

标签: c#

我只是试图传递一些值,但它一直在抛出一个错误。有人可以纠正我在这里缺少的东西吗?

这里收到错误

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();
                }
            }
        }
    }

3 个答案:

答案 0 :(得分:20)

此代码:

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);
    }
}

答案 1 :(得分:1)

你必须这样做:

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

同样ParameterizedThreadStart期望代理人以object作为参数,因此您需要将签名更改为:

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

    ...
}

答案 2 :(得分:1)

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

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

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