0

私はこのスレッドの世界に不慣れです。スレッドに関するチュートリアルをたくさん見ましたが、それでも自分の好きなように使うのは難しいと思います。私が欲しいのは、Pingの結果を取得した直後にラベルを更新することです。以下のコードは、すべてのping結果が返された後に一度にすべてのラベルを更新することを除いて、うまく機能しています。スレッドを使用すると、これに役立つと思います。

for (int i = 0; i < lblPings.Count; i++)
{
    Ping x = new Ping();
    if (txtTo[i].Text.Length > 0)
    {
        PingReply reply = x.Send(IPAddress.Parse(txtTo[i].Text)); 
        if (reply.Status == IPStatus.Success)
        {
            lblPings[i].Text = reply.RoundtripTime.ToString() + "ms";
            lblPings[i].ForeColor = Color.Blue;
        }
        else //if host is not reachable.
        {
            lblPings[i].Text = "Failed";
            lblPings[i].ForeColor = Color.Red;
        }
    }
}
4

2 に答える 2

1

ホストに無期限にpingを実行し、結果をどこにでも保存するスレッドを使用できます。問題は、スレッドがGUIを変更できなかったことですが、考えられる解決策は3つあります。

  • メインGUIのコールバックメソッドとしてデリゲート関数を使用する
  • 結果はどこにでも保存でき、GUIに保存されているタイマーから常に確認できます。
  • 最後に、 BeginInvokeメソッドを使用できます

幸運を!

于 2013-01-16T14:47:40.757 に答える
1

ここでは、舞台裏で何が起こっているのかを理解するのに役立ちます。

コントロールにプロパティを設定する場合、そのコントロールにそれ自体を再描画するように指示しているわけではありません。代わりに、2つのことが起こります。コントロールが後で再描画するときに使用するデータを変更することと、このコントロールが古くなっていることを示すメッセージをウィンドウシステムに送信することです。ここで、ウィンドウシステムが戻ってくるのを待って、更新が行われる前にコントロールを再描画する必要があります。

ここでの問題は、イベントハンドラーや他の通常のコードが使用するのと同じスレッドで再描画が行われることです。これは、メソッド全体が完了し、そのスレッドの制御フローがウィンドウシステムに戻るまで、通常のコードと思われるものを使用して制御を更新できない可能性があることを意味します。

DoEventsやInvokeなど、この問題を回避する方法はいくつかありますが、ほとんどの場合、Winformsアプリに最適なのはBackgroundWorkerコントロールを使用することだと思います。

于 2013-01-16T15:11:57.487 に答える