我想要将此方法线程化,以便我可以设置计时器而不是等待它完成。这是对服务的调用。
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));
但是它说“最好的重载匹配有一些无效的参数。”我做错了什么?
答案 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 */);