2013-06-26 3 views
0

그래서 TcpClient를 사용하여 서버에서 데이터를 보내고받는 시스템을 만들려고합니다. 내가 스레드가 데이터에 오심을 듣고있다멀티 스레드 콜백

는 내가 원하는 것은 할 수있는 방법을 만들 수있을 것입니다 :.> 스트림에

쓰기 응답> 프로세스의 응답을 기다립니다

그러나 동시에, 다른 관련없는 데이터는이 기간 동안 올 수 있습니다, 그래서 난 그냥 수행 할 수 없습니다

writer.WriteLine(""); 
string response = reader.ReadLine(); 

내가이 질문>Callbacks in C#에 '콜백'를 찾고 있었어요 그리고이 나는 것 같아 내가 갈 필요가있는 방법이지만, 내가 어떻게이 일을 계속할 수 있는지 완전히 확신 할 수는 없다.

도움이되면 도움이됩니다. 짐 Mischel에 대한

편집 :

public bool Login(string username, string password) { 
    writer.Write("{ \"username\" : \"" + username + "\", \"password\" : \"" + password + "\" }"; 
    //Somehow get the response which is being ran on another thread (See below) 

    //Process the JSON into a object and check is successful or not 
    if (msg.result == "Ok") return true; 
    else return false; 
} 

private void ReadThread() 
{ 
    while (running) 
    { 
     if (ns.DataAvailable) 
     { 
      string msg = reader.ReadLine(); 
      if (String.IsNullOrEmpty(msg)) continue; 
      Process(msg); //Process the message aka get it back to the Login method 
     } 
    } 
} 

편집 : 2 : 은 기본적으로 내가 로그인 메소드를 호출 할 수 있도록하려면

이 내가 달성하고자하는 물건의 종류는 TcpClient에 쓰고 같은 스트림에서 응답을 받기를 기다린 다음 부울 값을 반환합니다.

그러나 같은 기본적인 방법은 그래서 그것을 잘라하지 않을 :

public bool Login(string username, string password) { 
    writer.Write("{ \"username\" : \"" + username + "\", \"password\" : \"" + password + "\" }"; 
    string response = reader.ReadLine(); 
    if (response == "success") return true; 
    else return false; 
} 

이 작동하지 않을 다른 데이터가 자동으로 나에게 스트림을 통해 밀어 도착하기 때문에, 그래서에서는 ReadLine()에 기다릴 때, I 내가 찾는 응답 대신에 다른 것을 얻을 수 있습니다.

그래서이 문제를 해결할 수있는 솔루션을 찾고 있는데, 현재는 스트림에서 읽기 전용으로 실행중인 스레드가 있고 메시지를 처리하기 위해이 스레드로 메시지를 가져와야합니다. 위의 방법.

내가 생각하는 한 가지 방법은 전역 목록에 넣기 위해 메시지가 읽힐 때입니다. 그러면 로그인 메서드가 목록에서 메시지가 발견 될 때까지 List를 검사하는 루프에 넣을 수 있습니다 . 그러나 내가 생각할 때면, 이것은 끔찍한 개념입니다. 그래서 나는 대안을 찾고 있습니다.

+0

C# 5 (.NET 4.5)를 보증 할 수 있습니까? 'async/await'는 여러분의 경우에 딱 맞는 소리처럼 들리며 동기식으로 코드를 개발할 수있게 해줍니다. –

+0

.Net 4가 내가 가야 할 가장 높은 것이 었으면 좋겠다. 이것이 최후의 수단이 될 것이다. –

+0

Microsoft.Bcl.Async Nuget 패키지를 참조하고 C# 5 컴파일러를 사용하여 .NET 4를 사용할 수도 있습니다. – jods

답변

0

내 실수. 나는 당신이 단지 클라이언트를 만들고 싶다는 것을 알았다. 아래의 대부분은 여전히 ​​관련이 있습니다. 특히 링크 된 응답의 비동기 읽기/쓰기 기능입니다. 아마도 관련 부분을 파헤쳐 볼 수 있습니다. 또는 [TcpClient 비동기 예제]를 검색하십시오. 유효한 몇몇 좋은 견본이있다.

.NET에서 가장 쉬운 방법은 TcpListenerBeginAcceptTcpClient을 사용하여 비동기 적으로 연결을 만드는 것입니다. 그런 다음 TcpClient에서 네트워크 스트림을 가져 와서 비동기 읽기 및 쓰기를 수행하려면 BeginRead/EndReadBeginWrite/EndWrite을 사용할 수 있습니다.

링크 된 항목에는 좋은 예가 있습니다. 여기에 TCP Listener 예제가 있습니다. . .

아하!여기 있습니다 : https://stackoverflow.com/a/6294169/56778

+0

이것은 내가 원한 것과 비슷합니다. 자세한 설명을 위해 편집 된 게시물을보십시오. –