0

かなり一般的な c# while ループの質問があります。

このコードは、RDP セッションが完全に切断された後にのみ実行を継続する必要があります。

Connected プロパティが 0 に変更されると、RDP セッション接続が完全に終了したことを意味します。プロパティが 1 の場合、まだ接続されており、接続はまだ終了していません。

このコードに本質的に悪い点があると思う人はいますか? それについてもっと良い方法はありますか?

private void Reconnect()
{
    rdp1.Disconnect(); // force the RDP session to disconnect
    while (rdp1.Connected == 1) // true as long as RDP is still connected
    {
        // do nothing
    } 
    rdp1.Connect(); // execute this code after while loop is broken
}

/**************************************************** ************/

ジェームズの回答に従って使用した最終的なコードは次のとおりです。私の目的では、カウンターはタイムアウトとして十分です。

            int i = 0;
            rdp1.Disconnect();
            while (rdp1.Connected == 1)
            {
                if (i == 1000 * 10) break;
                else Thread.Sleep(100);
                i++;
            }
            rdp1.Connect();
4

2 に答える 2

1

目的に合わせてタイムアウトを設定する

private void Reconnect()
{
    timeOut = false;
    new System.Threading.Thread(new System.Threading.ThreadStart(setTimeout)).Start();
    rdp1.Disconnect(); 
    while (rdp1.Connected == 1 && !timeOut);
    rdp1.Connect();
}

bool timeOut = false;

void setTimeout()
{
    System.Threading.Thread.Sleep(7000);
    timeOut = true;
}
于 2015-03-17T02:06:23.847 に答える
1

ループの本体で何かを行う必要があります。そうしないと、すべての CPU (少なくとも 1 つのコア) を消費します。System.Threading.Thread.Sleep(100)通常、このタイプのループでは、または何か を使用してしばらく寝ます。Sleepwhile 条件を再度チェックする前に、ミリ秒単位で待機します。理想的には、RDP オブジェクトには、ミューテックスやイベント、または切断されるまでブロックできる何かが必要ですが、それが省略されても驚かないでしょう。

編集: ベンが指摘したように、ループから抜け出す方法を用意することも常に良い考えです。このようなもの(あなたが述べた答えはCPUの速度に依存し、CPUがはるかに高速になったときに将来壊れる可能性があります):

DateTime stop = DateTime.UtcNow.AddSeconds(30);
while (rdp1.Connected)
{
    if (DateTime.UtcNow > stop) throw new ApplicationException ("RDP disconnect timeout!");
    System.Threading.Thread.Sleep (100);
}

もちろん、マジック ナンバーではなく、定数、 readonly TimeSpan、または動的に構成可能なでタイムアウトを指定することをお勧めしますTimeSpan。おそらく、この場合には特定の例外クラスが必要です。

于 2015-03-17T01:41:32.627 に答える