2011-08-18 104 views
1

我想要这个方法被编出来,所以我可以设置一个计时器而不是等待它完成。这是对服务的呼叫。c中的线程问题#

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

但它说“的最佳重载的比赛有一些无效的参数。”我究竟做错了什么?

回答

3

尝试:

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

这将异步调用你的方法。

+0

如何传递它的参数? – slandau

+0

修正了它,犯了一个错误(忽略了参数) – Bas

+0

BeginIvoke不会创建一个新的线程 – sll

0

System.Threading.Thread构造函数接受一个委托作为它的参数。 尝试

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

这不会工作,因为我猜我的方法是不正确的。 – slandau

+0

问题是你的方法是静态的。线程构造函数接受一个委托映射到带有签名void方法(obj params)的方法。由于它是静态的,请使用发布的调用者答案。 – tafoo85

+0

@ tafoo85:您可以将具有正确签名的静态方法传递给Thread.Start(...),问题是OP的方法有错误的签名 – sll

0

有一个在System.Threading.Thread类没有构造函数带你已通过类型的代表。您只能传递threadstart或paramererizedthreadstart类型的委托。

0

回答你的问题“我做错了什么?” - 你试图通过与签名方法,该方法不受ParameterizedThreadStart代表支持(see here

签名应该是

void ParameterizedThreadStart(Object obj) 

,而不是

void ParameterizedThreadStart(
        ValueEngineService.Contracts.ValueEngServiceParams param) 
0

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

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

它会在新线程上运行你的代码。如果你需要做的事情,当它完成时,那么你也可以很容易地做到这一点:

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