2010-12-06 2 views
1

분산 형 해시 서버와의 소켓 통신에 비동기식 io를 사용하고 싶습니다. 환경은 C# 3.5이지만 필요한 경우 4.0을 사용할 수 있습니다. 비동기 IO 시스템 스레드 풀을 사용C# 비동기 IO : 작업 순서를 보장하는 방법이 있습니까?

socket.set_asynch("FOO","bar"); 
string rc = socket.get_asynch("FOO"); 

때문에, 두 개의 명령이 개 다른 스레드에서 실행할 수 있습니다 :

은 가정하자 나는 (의사)에 다음과 같은 비동기 명령을 실행합니다. rc가 "bar"와 같은지 어떻게 확인할 수 있습니까? 즉, 두 번째 명령이 실행되기 전에 첫 번째 명령 이 발행됩니까?

감사합니다!

class DistributedHashTable 
{ 
    public Task SetAsync(string key, string value); 

    public Task<string> GetAsync(string key); 
} 

두 방법은 각각의 작업을 수행하는 비동기 IO를 사용하는 것이, 언제 작업 완료에 반환 된 작업 <T>을 설정

+8

를 사용하여 동기 IO를 ? – ChaosPandion

+1

@ChaosPandion : 나도 그래,하지만 사실이야. –

+0

비동기 동작을 제어하기 위해 프레임 워크를 사용하지 않는 이유가 있습니까? –

답변

6

당신은 Task<T> class (작업 병렬 라이브러리) 주위에 당신의 API를 설계 할 수 끝내다.

그럼 당신은 같은 동 기적으로 클래스를 사용할 수 있습니다

var dht = new DistributedHashTable(...); 

dht.SetAsync("FOO", "bar").Wait(); 

Console.WriteLine(dht.GetAsync("FOO").Result); 

또는 비동기 적으로이 같은 :

var dht = new DistributedHashTable(...); 

dht.SetAsync("FOO", "bar") 
    .ContinueWith(t => dht.GetAsync("FOO")) 
    .Unwrap() 
    .ContinueWith(t => { 
          Console.WriteLine(t.Result); 
         }); 

또는 비동기과 같이 Async CTP 사용 :

var dht = new DistributedHashTable(...); 

await dht.SetAsync("FOO", "bar"); 

Console.WriteLine(await dht.GetAsync("FOO")); 
+0

철저하게 +1하세요! 34.9k는 잘 받았습니다. – Jacko