2011-12-23 12 views
2

私は、メソッドを実行するC#でスレッドを作成するメソッドを持っています(CallCheckLogic - 下記参照)。 )メソッド(例えば、ChecksObject.Check1Logic())スリープスレッドメソッドのようなループは無視されています。私には論理的な意味はありません。誰かがこの行動が起こっている理由を説明できるでしょうか?スレッドが眠っていないと言われたとき

期待される結果:自体は、その後、その後のThread.sleep(60000)ChecksObject.Check1Logic >> ChecksObject.Check7Logicを呼び出し、新しいスレッドが作成され、方法CallCheckLogicが呼び出されます。スレッドが60秒間スリープ状態になると、ループが実行され、CallCheckLogicが再び実行されます。

private void StartCheckerThread() 
{ 
    Thread t = new Thread(o =>{CallCheckLogic();});t.Start(); 
    running = true; 
} 

public void CallCheckLogic() 
{ 
    Checks ChecksObject = new Checks(); 
    ChecksObject.Check1Logic(); 
    ChecksObject.Check2Logic(); 
    ChecksObject.Check3Logic(); 
    ChecksObject.Check4Logic(); 
    ChecksObject.Check5Logic(); 
    ChecksObject.Check6Logic(); 
    ChecksObject.Check7Logic(); 

    // This method/delegate parses the outfile of "temp" or rather the results of the tests and turns on/off the appropriate light on the GUI 
    LightControlDelegate d1 = new LightControlDelegate(lightControl); 
    this.BeginInvoke(d1); 
    Thread.Sleep(60000); 

    //LoopPorts(); 
} 

ChecksObject.Check1Logic方法:私はここにすべてのループが表示されない

public void Check1Logic() 
{ 
    // clean up time! 
    File.Create("temp").Dispose(); 

    // lets grabs the info from the config! 
    var lines = File.ReadAllLines("probe_settings.ini"); 
    var dictionary = lines.Zip(lines.Skip(1), (a, b) => new { Key = a, Value = b }) 
          .Where(l => l.Key.StartsWith("#")) 
          .ToDictionary(l => l.Key, l => l.Value); 

    // lets define variables and convert the string in the dictionary to int for the sock.connection method! 

    int portno1; 
    int.TryParse(dictionary["#PortNo1"], out portno1); 

    // Convert hostname to IP, performance issue when using an invalid port on a hostname using the TcpClient class! 
    IPAddress[] addresslist = Dns.GetHostAddresses(hostname2); 

    foreach (IPAddress theaddress in addresslist) 
    { 
     // Attempt to create socket and connect to specified port on host 
     TcpClient tcP = new System.Net.Sockets.TcpClient(); 
     try 
     { 
      tcP.ReceiveTimeout = 1; 
      tcP.SendTimeout = 1; 
      tcP.Connect(theaddress, portno1); 
      tcP.Close(); 
      StreamWriter sw = File.AppendText("temp"); 
      sw.Flush(); 
      sw.WriteLine("Check1=Success"); 
      sw.Close(); 
     } 
     catch 
     { 
      StreamWriter sw = File.AppendText("temp"); 
      sw.WriteLine("Check1=Fail"); 
      sw.Close(); 
     } 
    } 
} 
+4

+1 ...陽気な:) :) :) – TheBoyan

+0

真剣に、CallCheckLogic()スレッドはSleep()になります。あなたはそれがそうではないと思いますか?あなたはループ部分を残しました。 –

+0

"ChecksObject.CheckXLogic"メソッドでチェックされているbingのリモートポートが継続的に(メソッドがループしているように)表示されているため、ChecksObject.Check1Logicメソッドを追加しました。多くの場合同じ) – Mike

答えて

2

CallCheckLogicメソッドが1回呼び出された後、そのメソッドは終了し、スレッドは実行を停止します。 あなたのCheckXLogicに無限ループがあるかもしれません。あなたのスレッドは常に動作しているようですが、スリープコールに問題があるとは言えません。

Sleepの直前と直後にブレークポイントを追加しようとすると、このコード行が実行されたかどうかがわかります。

関連する問題