2010-11-22 3 views
4

주 스레드 프로세스에 개체를 전달하려고 시도했지만 생각했던대로 작동하지 않습니다.스레드에 개체 전달 실패 - C#

Thread thrUDP; 

그런 다음 나는 내가 필요로하는 데이터를 저장하는 데 사용하는 객체 생성 :

먼저 내가 스레드 생성

UDPData udpData; 

가 지금은 정확한 데이터 따르며, 객체를 초기화를 설정 새로운 스레드를 시작하고 Start() 메소드에 전달 된 객체로 시작하십시오.

udpData = new UDPData("224.5.6.7", "5000", "0", "2"); 

      thrUDP = new Thread(new ParameterizedThreadStart(SendStatus)); 
      thrUDP.Start(udpData); 

이것은 th입니다. 내가 잠시 다시 스레드를 사용하여 기억하고 내가 길을 잘못이 일을 오전, 그들이에 데이터를 전달하는 매우 어려운 아니었다 확신 아니면 그냥 실종

private void SendStatus(UDPData data) 
{ 
} 

을 : 전자의 방법은 내가 시작하고자하는 코드 조각?

감사합니다.

public delegate void ParameterizedThreadStart(object obj); 

분명히,이 위양이 방법의 서명과 호환되지 않습니다, 그리고 System.Threading.Thread 임의 delegate- 작업을 얻을 수있는 직접적인 방법이되지 않습니다 :

답변

3

ParameterizedThreadStart 대표는 다음과 같이 선언 유형. 옵션의

하나는 방법에 대한 호환 서명을 사용할 수 있으며, 적절한 캐스팅 것 :

private void SendStatus(object obj) 
{ 
    UDPData data = (UDPData)obj; 
    ... 
} 

다른 옵션은 C# 컴파일러에 문제를 펀트하는 것, 클로저를 생성. 예 :

new Thread(() => SendStatus(udpData)).Start(); 

ThreadStart 대리자를 대신 사용합니다. 또한 캡쳐 된 후 이후에 udpData 로컬을 수정하는 데주의해야합니다.

또는 스레드를 생성하는 대신 스레드 풀을 사용하면 비동기 대리자를 사용할 수 있습니다. 예를 들면 :

Action<UDPData> action = SendStatus; 
action.BeginInvoke(udpData, action.EndInvoke, null); 
+0

아, 그래서 단순히 매개 변수 유형을 변경 한 다음 방법에서 올바른 유형으로 캐스팅하는 데 필요한! 감사합니다.] –

+1

@ Jamie Keeling : 네, 맞습니다. 그것은 약간의 고통입니다, 그렇지 않습니다 ... – Ani

+0

나는 동의하지 않습니다 - 일반적으로 수업은 내부에서 새로운 스레드를 만들어야합니다 - 외부에서 스레드를 만드는 것은 동기화가 복잡해지면 내 pov의 데스트 마스터를위한 방법입니다. – weismat

1
private void SendStatus(object data) 
{ 
UDPData myData = (UDPData) data; 
} 
관련 문제