2011-08-18 8 views
1

타이머를 설정하고 완료 될 때까지 기다릴 수 없도록이 방법을 스레드 아웃하고 싶습니다. 그것은 서비스에 대한 호출입니다.C에서 스레딩 문제 #

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

를하지만 말하는 :

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

나는 이런 식으로 그것을 밖으로 스레딩 시도 '최고의 과부하가 일치하는 일부 잘못된 인수가 있습니다.' 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

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 method (obj params)가있는 메소드에 매핑되는 델리게이트를 사용합니다. 정적이기 때문에 게시 된 호출자 응답을 사용하십시오. – tafoo85

+0

@ tafoo85 : 올바른 서명이있는 정적 메서드를 Thread.Start (...)에 전달할 수 있습니다. 문제는 OP 메서드의 서명이 잘못되었습니다. – sll

0

이 통과 한 유형의 위임을 System.Threading.Thread 클래스의 생성자가 없습니다 시도 . threadstart 또는 paramererizedthreadstart 유형 대리자 만 전달할 수 있습니다.

0

"내가 뭘 잘못하고 있니?" - 당신은 (see here)

서명이

void ParameterizedThreadStart(Object obj) 

해야 ParameterizedThreadStart 위임에 의해 지원되지 않는 서명 방법을 전달하는 데 노력하고

void ParameterizedThreadStart(
        ValueEngineService.Contracts.ValueEngServiceParams param) 
0

당신은 .NET 4를 사용하고 있지? 그렇다면 다음을 수행 할 수 있습니다.

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

그리고 새 스레드에서 코드가 실행됩니다. 완료 될 때 무언가를해야한다면 쉽게 할 수 있습니다.

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