2012-03-23 10 views
2

이전에 asyn 작업 또는 여러 스레드를 사용하지 않았으므로이 모든 것이 나에게 새로운 것입니다. 그래서 내가로 돌아가 다음 제어를위한 경우에 원하는 것은C# async object

내가

public class pinger 
{ 


    // Constructor 
    public Pinger() 
    { 
    do while exit = False; 
    Uri url = new Uri("www.abhisheksur.com"); 
     string pingurl = string.Format("{0}", url.Host); 
     string host = pingurl; 
     bool result = false; 
     Ping p = new Ping(); 
     try 
     { 
      PingReply reply = p.Send(host, 3000); 
      if (reply.Status == IPStatus.Success) 
       result = true; 
     } 
     catch { } 
     //wait 2 seconds 
     loop; 
    } 


} 

그래서 난

Pinger firstone = new Pinger 

이것을 호출 할 수 아래 같은 수준의 뭔가가 있다고 가정 몇 가지 지침에 대한 기대했다 메인 스레드는 생성 된 인스턴스를 실행 상태로두고 매 2 초마다 호스트에 ping을 수행하고 결과 변수를 업데이트하여 주 스레드의 상태를 알고 싶을 때 get 속성을 사용할 수 있습니다. 예를 들어이 :

건배

아론

을이 밖으로 시도하는 것이 쉬운 일이 보였다으로

어느 한 핑을 사용하여 C#에서 멀티 스레딩에 저를 소개하는 좋은 읽기/예를 제안 할 수

답변

3

나는 클래스가

public class pinger 
{ 
    private Uri m_theUri; 
    private Thread m_pingThread; 
    private ManualResetEvent m_pingThreadShouldStop; 

    private volatile bool m_lastPingResult = false; 

    public Pinger(Uri theUri) 
    { 
     m_theUri = theUri; 
    } 


    public void Start() 
    { 
     if (m_pingThread == null) 
     { 
      m_pingThreadShouldStop = new ManualResetEvent(false); 
      m_pingThread = new Thread(new ParameterizedThreadStart(DoPing)); 
      m_pingThread.Start(m_theUri); 
     } 
    } 

    public void Stop() 
    { 
     if (m_pingThread != null) 
     { 
      m_pingThreadShouldStop.Set(); 
      m_pingThread.Join(); 

      m_pingThreadShouldStop.Close(); 
     } 
    } 


    public void DoPing(object state) 
    { 
     Uri myUri = state as Uri; 
     while (!m_pingThreadShouldStop.WaitOne(50)) 
     { 
      // Get the result for the ping 
      ... 

      // Set the property 
      m_lastPingResult = pingResult; 
     } 
    } 


    public bool LastPingResult 
    { 
     get { return m_lastPingResult; } 
    } 
} 

은 무엇입니까 :-) 보일 것입니다 방법을 간략하게 설명 할 수 있습니까? StartStop 메소드가있는 새로운 클래스입니다. Start은 핑을 시작하고 Stop은 핑을 중지합니다.

핑은 별도의 스레드에서 수행되며 모든 ping에서 결과 속성이 업데이트됩니다.

+0

도대체 어떻게 너희들이 그렇게 빨리 대답 해 !! 나는 이것을 조금 보면서 당신에게 알려 줄 것이다 :) 그러나 이것은 매우 유망 해 보입니다. 프로그래밍의 논리를 이해할 수 있습니다. 여러분이하는 것처럼 구문을 기억하고 기억할 수 있기를 바랍니다. – DevilWAH

+0

구문이 100 % 정확한지 확실하지 않습니다. Visual Studio에 이것을 붙여 넣을 때 나타납니다 .--) 그런 식으로 일을 오래할수록 더 잘 수행 할 수 있습니다. –

+0

ManualResetEvent, ParameterizedThreadStart, Thread, "using using directive 또는 assembly reference?"가 표시됩니다. System.Threading을 사용하고 있습니다.작업; 포함되어 있지만 내가 놓친 다른 것이 있습니까? – DevilWAH

3

이 작업 병렬 라이브러리 (TPL)를 권장합니다. TPL 사용에 대한 훌륭한 기사는 here입니다.

C#의 스레드에 대한 다른 정보는 Joseph Albahari's blog에서 찾을 수 있습니다. 이것은 당신이 시작하는데 필요한 모든 정보를 제공해야합니다.

이 정보가 도움이되기를 바랍니다.

편집 : 위의 스레드를 만드는 방법에 대한 예제가 필요하면 기꺼이 도와 드리겠습니다.

+0

나는 치즈를 그들을 볼 것이다, 그러나 나는 토르스텐의 아래 것을 가지고 있다고 생각 :

더 아래에 표시된 프로그램의 출력은 싸서. :) – DevilWAH

0

코드 경로가 상호 작용하는 3 개의 코드 경로가있는 Task 기반 접근 방식을 생각해 냈습니다. 하나의 스레드로 작업하는 것이 가장 가능성이 높습니다. 내가 예를의 제안에 네 말을,

enter image description here

public class Program 
{ 
    public static object _o = new object(); 
    public static void Main(string[] args) 
    { 
     PingReply pingResult = null; 
     int i = 0; 
     Task.Run(async() => 
     { 
      var ii = 0; 
      //no error handling, example only 
      //no cancelling, example only 
      var ping = new System.Net.NetworkInformation.Ping(); 
      while (true) 
      { 
       Console.WriteLine($"A: {ii} > {DateTime.Now.TimeOfDay}"); 
       var localPingResult = await ping.SendPingAsync("duckduckgo.com"); 
       Console.WriteLine($"A: {ii} < {DateTime.Now.TimeOfDay}, status: {localPingResult?.Status}"); 
       lock (_o) 
       { 
        i = ii; 
        pingResult = localPingResult; 
       } 

       await Task.Delay(1000); 
       ii++; 
      } 
     }); 

     Task.Run(async() => 
     { 
      //no error handling, example only 
      while (true) 
      { 
       await Task.Delay(2000); 
       lock (_o) 
       { 
        Console.WriteLine($"B: Checking at {DateTime.Now.TimeOfDay}, status no {i}: {pingResult?.Status}"); 
       } 
      } 
     }); 

     Console.WriteLine("This is the end of Main()"); 
     Console.ReadLine(); 
    } 
}