2010-12-05 2 views
2

내 소켓에 C# 비동기식 io 모델을 사용하고 싶습니다. 소켓을 통해 전송해야하는 스레드가 여러 개 있습니다 ( ). 이것을 처리하는 가장 좋은 방법은 무엇입니까? 잠금으로 제어되는 액세스 권한이있는 N 개의 소켓 풀? 또는 asynch가 단일 소켓에 액세스하는 다중 스레드에 대해 thread-safe 을 전송합니까?여러 스레드에서 액세스하는 C# 비동기 소켓

THanks!

바로 잭

+0

http://www.albahari.com/threading/ 최상의 스레딩 솔루션을 찾으려고 할 때 편리합니다. – Patrick

+0

따라야 할 프로토콜이 있습니까? 스트림을 순차적으로 전송해야합니까? – Patrick

+0

고마워, 패트릭. 알바 하리가 유용 해 보입니다. 소켓을 사용하여 원격 서버에서 값을 설정하고 가져옵니다. 비동기 소켓 io 찾고 있는데,하지만 그것은 시스템 스레드 풀을 사용하는 이해합니다. 그래서 나는 – Jacko

답변

2

비동기 방법은 이미 데이터를 전송하기 위해 새로운 스레드를 만들 동기화 및 경주 조건에서 편리하게 무언가이다. 이렇게하면 응용 프로그램에 불필요한 오버 헤드가 추가 될 수 있습니다. 이미 여러 개의 스레드가있는 경우 소켓에 대한 액세스를 나타내는 IDispoable 유형의 객체와 소켓에 대한 체크인 및 체크 아웃을 제어하는 ​​관리자를 만들 수 있습니다. IDisposable dispose 메서드가 호출되면 소켓 자체가 체크인됩니다. 이 방법으로 스레드가 소켓에서 수행 할 수있는 메소드를 제어 할 수 있습니다. 소켓이 이미 다른 스레드에 의해 체크 아웃 된 경우 관리자는 사용 가능할 때까지 단순히 차단합니다.

using (SharedSocket socket = SocketManager.GetSocket()) 
{ 
    //do things with socket 
} 
+0

고마워, 좋은 생각. 나는 이미 이와 비슷한 것을 가지고있다. 나는 호출 스레드가 증가함에 따라 이것이 잘 확장되지 않을까 걱정됩니다. 그들은 많은 시간을 막을 수 있습니다. – Jacko

+1

스레드가 소켓에만 쓰는 경우 큐를 사용하여 데이터를 소켓에 쓰고 다른 스레드에서 데이터를 소비하게 할 수 있습니다. 이렇게하면 호출하는 스레드가 전혀 블록 할 필요가 없습니다. –

+0

감사. 그걸 시험해 볼거야. 다중 코어를 사용하기를 원하기 때문에이 대기열 소켓을 몇 개 실행할 수도 있습니다. – Jacko

1

System.Threading.Semaphore

관련 문제