1

私のアプリケーションには、「接続済み」と「未接続」という 2 つのラベルが付いた 2 つのテキスト ボックスがあります。私のコードに見られるように、接続が確立されると、「接続済み」テキスト ボックスが緑色で塗りつぶされ、ネットワーク接続を示します。ない場合は赤になります。

接続検出の機能は正常に機能していますが、変更を検出するにはアプリケーションを再度開く必要があります。接続の変化を検出するために、アプリケーションを 5 ~ 10 秒ごとに自動的に更新する方法を探しています。カラーテキストボックスだけで、他のフィールドやボックスの内容をフラッシュしたくありません。いわばソフトポーリングループ。Timer メソッドを使用してこれを行うにはどうすればよいでしょうか。タイマーを実行してボックスを更新する新しいスレッドを作成する必要がありますか?

ありがとう。

  if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() == false)
        {
            noConnect.Select();  //if not connected, turn box red
            noConnect.BackColor = Color.Red;

        }

        else
        {
            netConnect.Select();  // if connected, turn box green
            netConnect.BackColor = Color.Lime;

        }

        //need to refresh box/application without losing other box/field contents 
        //in order to constantly check connectivity around 5-10 seconds or so
        //constantly check connectivity 
4

3 に答える 3

6

このようなものはうまくいくでしょう

    public Form1()
    {
        InitializeComponent();
        var timer = new Timer();
        timer.Tick += new EventHandler(timer_Tick);
        timer.Interval = 10000; //10 seconds
        timer.Start();
    }

    void timer_Tick(object sender, EventArgs e)
    {
        if (your_function_call())
        {
            netConnect.BackColor = Color.Green;
        }
        else
            netConnect.BackColor = Color.Red;
    }

timer_Tickは間隔ごとに繰り返し呼び出され、ステータスをポーリングしてコントロールを更新できます。タイマーのコールバックはUIスレッドで呼び出されるため、任意のUI要素を更新できます。

タイマークラスから

タイマーは、ユーザー定義の間隔でイベントを発生させるために使用されます。このWindowsタイマーは、UIスレッドを使用して処理を実行するシングルスレッド環境向けに設計されています。ユーザーコードでUIメッセージポンプを使用でき、常に同じスレッドから操作するか、呼び出しを別のスレッドにマーシャリングする必要があります。このタイマーを使用する場合は、Tickイベントを使用して、ポーリング操作を実行するか、指定した期間スプラッシュ画面を表示します。Enabledプロパティがtrueに設定されていて、Intervalプロパティがゼロより大きい場合は常に、Intervalプロパティの設定に基づいてTickイベントが一定の間隔で発生します。

このソリューションはSystem.Windows.Forms.Timer、UIスレッドのティックを呼び出すを使用します。コールバックを使用する場合System.Timers.Timer、UIスレッドにはありません。

于 2012-08-14T12:21:56.940 に答える
1

アプリケーションのどこかにタイマーを作成できます

var timer = new System.Timers.Timer();
timer.Interval = 5000; // every 5 seconds
timer.Elapsed = (s, e) => {
    // Your code
};
timer.Start();

注: Elapsed イベント ハンドラーのコードは別のスレッドで実行できることに注意してください。

于 2012-08-14T12:19:25.877 に答える
1

タイマーを作成するだけです。他に何もしなくても、彼自身のスレッドでうまく実行されます。

于 2012-08-14T12:18:10.653 に答える