c#中的线程问题

时间:2011-08-18 13:51:14

标签: c# .net multithreading wcf

我想要将此方法线程化,以便我可以设置计时器而不是等待它完成。这是对服务的调用。

private static void callValueEng(ValueEngineService.Contracts.ValueEngServiceParams param)
{
    using (WCFServiceChannelFactory<IValueEngineService> client =
              new WCFServiceChannelFactory<IValueEngineService>(
                  Repository.Instance.GetWCFServiceUri(typeof(IValueEngineService))))
    {
        client.Call(x => x.ValueManyTransactionsWithOldEngines(translatedParams));
    }
}

我试着像这样穿出它:

System.Threading.Thread newThread;
//RestartValueEngineService();

List<TransactionInfo> currentIdsForValuation = ((counter + 7000) <= allIds.Count) 
                              ? allIds.GetRange(counter, 7000) 
                              : allIds.GetRange(counter, allIds.Count - counter);
translatedParams.tranquoteIds = currentIdsForValuation;

// thread this out
newThread = new System.Threading.Thread(callValueEng(translatedParams));

但是它说“最好的重载匹配有一些无效的参数。”我做错了什么?

5 个答案:

答案 0 :(得分:3)

尝试:

var invoker = new Action<ValueEngineService.Contracts.ValueEngServiceParams>(callValueEng);
invoker.BeginInvoke(translatedParams, null, null);

这将异步调用您的方法。

答案 1 :(得分:0)

System.Threading.Thread构造函数将委托作为参数。 试试

newThread = new System.Threading.Thread(new ParameterizedThreadStart(callValueEng));
newThread.start(translatedParams);

答案 2 :(得分:0)

System.Threading.Thread类中没有构造函数,它接受您传递的类型的委托。你只能传递threadstart或paramererizedthreadstart类型委托。

答案 3 :(得分:0)

回答你的问题“我做错了什么?” - 您尝试传递ParameterizedThreadStart委托不支持的签名方法(see here

签名应该是

 void ParameterizedThreadStart(Object obj)

而不是

void ParameterizedThreadStart(
                    ValueEngineService.Contracts.ValueEngServiceParams param) 

答案 4 :(得分:0)

您使用的是.NET 4吗?如果是这样,你可以这样做:

 Task.Factory.StartNew(() => callValueEng(translatedParams));

它将在新线程上运行您的代码。如果你在完成时需要做一些事情,那么你也可以轻松地做到这一点:

Task.Factory.StartNew(() => callValueEng(translatedParams))
    .ContinueWith(() => /* Some Other Code */);