我只是试图传递一些值,但它一直在抛出一个错误。有人可以纠正我在这里缺少的东西吗?
这里收到错误
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();
}
}
}
}
答案 0 :(得分:20)
此代码:
Thread t_PerthOut = new Thread(new ThreadStart(ReadCentralOutQueue("test"));
尝试调用ReadCentralOutQueue
和然后从结果中创建委托。这不会起作用,因为它是一种无效方法。通常,您使用方法组来创建委托,或使用匿名函数(如lambda表达式)。在这种情况下,lambda表达式将是最简单的:
Thread t_PerthOut = new Thread(() => ReadCentralOutQueue("test"));
您不能只使用new Thread(ReadCentralOutQueue)
,因为ReadCentralOutQueue
与ThreadStart
或ParameterizedThreadStart
的签名不符。
了解为什么您收到此错误以及如何解决此问题非常重要。
编辑:只是为了证明它 工作,这是一个简短但完整的程序:
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();