2010-02-23 5 views
0

소켓에서 오는 데이터를 가져와야하는 WinForm 응용 프로그램을 만들고 싶습니다.다른 스레드의 소켓이있는 GUI

코드를 별도의 스레드에서 소켓에서 읽고 싶습니다. InvokeRequired/BeginInvoked 패턴을 알고 있습니다.

WinForm 시나리오를 고려할 때 가장 적합한 C# 스레드 유형은 무엇입니까? 충분히 System.Threading.Thread 소켓 또는 BackgroundWorker 같은 다른 유형의 데이터를 읽기 전용으로 충분합니까? 아니면 다른 것을 고려해야합니까?

+0

서명 (또는 인사말)이 필요하지 않습니다. – Ricket

답변

0

이 스레드는 오랜 시간 실행되고 있습니까? 오랜 시간 동안 실행해야하고, GUI (아마도 데이터를 버퍼에 캐시)와 직접 상호 작용할 필요가 없다면 System.Threading.Thread를 사용할 것입니다. BackgroundWorker를 사용하여 이벤트를 통해 GUI를 업데이트 할 수 있지만 .NET Threadpool을 사용한다는 것을 알았습니다. 스레드 풀에는 제한된 양의 스레드가 있으므로 BeginInvoke를 통해 Windows Workflow 또는 많은 대리인을 사용해야하는 경우 너무 많은 스레드 풀 스레드를 묶어 응용 프로그램 성능을 저하시킬 수 있습니다.

+0

풀 스레드를 묶는 것은 새 스레드를 만드는 것보다 느리게 (또는 더 나은) 느리지 않습니다. –

+0

예! 그것은 거대한 양의 데이터를 수신 한 채 몇 시간 동안 실행됩니다 + GUI를 업데이트해야합니다. ThreadPool이 완전히 채워질 것이므로 캐시 버퍼 + 새로 고침 Gui를 n 밀리 초마다 사용할 것입니다. 감사! –

+0

@Henk : 스레드 풀에서 스레드를 사용하면 사용 가능할 때까지 다른 스레드 풀 스레드를 시작할 수 없다는 인상하에있었습니다. 그렇게 할 수 없다면 어떤 일도 할 수 없습니다. 이 정의에 따르면 응용 프로그램 성능을 손상시킬 수 있습니까? – Dave

2
Thread workerThread = new Thread(); 
// do threadstart parameters or whatever 
workerThread.IsBackground = true; 
workerThread.Start(); 

충분해야합니다 ... 우려 사항이있는 경우 우선 순위를 설정할 수도 있습니다.

특히 BackgroundWorker는 신경 쓰지 않습니다. 이벤트가 도움이되지만 도움이 필요하지 않습니다. 비동기 메서드 (Action/Func)를 많이 사용하기 때문에 제한적입니다.

MSDN으로 주 배경 작업자 프로세스 :

는 백그라운드 작업에 대해 설정 한 DoWork 이벤트에 대한 이벤트 처리기를 추가합니다. 이 이벤트 핸들러에서 시간이 많이 걸리는 작업을 호출하십시오. 작업을 시작하려면 RunWorkerAsync를 호출하십시오. 진행률 업데이트에 대한 알림을 받으려면 ProgressChanged 이벤트를 처리하십시오. 작업이 일 때 알림을 받으려면 RunWorkerCompleted 이벤트를 처리하십시오.

System.Threading.Thread를 사용하면 훨씬 간단 해 보입니다.

+0

안녕하세요 dboarman! 답장을 보내 주셔서 감사 드리며 귀하의 의견에 동의합니다. 나는이 헬퍼 클래스에 관해서 만 오늘 깨달았지만이 질문을 던졌지 만, 그 특별한 이유를 이해하지 못했습니다. 이 클래스는 GUI 시나리오에서 항상 도우미 클래스로 언급됩니다. –

1

당신은, 즉

mySocket.BeginReceive(..., myCallBack); 

을 APM 패턴을 사용할 수 있습니다 그러나 그것은 나의 마음에 드는 패턴이 아니다. ThreadPool을, 아마도 BackgroundWorker를 통해 사용할 것입니다.

+0

감사합니다 Henk! 나는 아마도 많은 수의 데이터를 수신했기 때문에 문제가 생길 것임을 알았다. –

+0

@Abruzzo, 스레딩 부분 (몇 개의 스레드)에 대해 데이터의 양은 중요하지 않습니다. 그러나 소켓 (연결)의 수는 않습니다. –

관련 문제