0

応答可能なIP RoundtripTimeのリストをコンパイルするために、datagridviewのすべてのIPに対してpingを実行するアプリケーションがあります。ステップを完了したら、RoundtripTimeをdatagridviewに戻します。Ping.SendAsyncをdatagridviewで使用するには?

... 
     foreach (DataGridViewRow row in this.gvServersList.Rows) 
     { 
      this.current_row = row; 

      string ip = row.Cells["ipaddr_hide"].Value.ToString(); 

      ping = new Ping(); 

      ping.PingCompleted += new PingCompletedEventHandler(ping_PingCompleted); 

      ping.SendAsync(ip, 1000); 

      System.Threading.Thread.Sleep(5); 
     } 
    ... 

    private static void ping_PingCompleted(object sender, PingCompletedEventArgs e) 
    { 
     var reply = e.Reply; 
     DataGridViewRow row = this.current_row; //notice here 
     DataGridViewCell speed_cell = row.Cells["speed"]; 
     speed_cell.Value = reply.RoundtripTime; 
    } 

私は現在の行を取得するためにDataGridViewRow row = this.current_row;を使用しますが、私はエラーキーワードを取得したい「これは」バックのDataGridViewに値をプッシュする方法、静的function.soでは使用できませんか?

ありがとうございます。

答えて

0

何KAJは語りました。しかし、グリッドのIPアドレスに接続されていないため、ping要求の結果が混乱する可能性があります。どのホストが最初に応答するのかを知ることができず、ping> 5msがあると、currentrowがコールバックの間で変化しているため何かが起こる可能性があります。あなたがする必要があるのは、コールバックへのdatagridviewrow参照を送ることです。これを行うには、SendAsyncのオーバーロードを使用します。

ping.SendAsync(ip, 1000, row); 

とコールバックで:

DataGridViewRow row = e.UserState as DataGridViewRow; 

をまた確認要求がタイムアウトしなかったことにするためにreply.Statusをチェックすることをお勧めします。

+0

ありがとう、それは私のための簡単な方法です! – jean

0

は、現在のインスタンスを参照します。静的メソッドはインスタンスに対してではなく、その型にのみ適用されます。したがって、thisは利用できません。

したがって、staticキーワードをイベントハンドラ宣言から削除する必要があります。メソッドはインスタンスに対抗します。

ます。また、データグリッドビューを更新しようとする前に戻ってUIスレッドにコードをマーシャリングする必要があるかもしれない - そう、あなたは、次のようなコードの何かが必要だろうとします。

delegate void UpdateGridThreadHandler(Reply reply); 

private void ping_PingCompleted(object sender, PingCompletedEventArgs e) 
{ 
    UpdateGridWithReply(e.Reply); 
} 

private void UpdateGridWithReply(Reply reply) 
{ 
    if (dataGridView1.InvokeRequired) 
    { 
     UpdateGridThreadHandler handler = UpdateGridWithReply; 
     dataGridView1.BeginInvoke(handler, table); 
    } 
    else 
    { 
     DataGridViewRow row = this.current_row; 
     DataGridViewCell speed_cell = row.Cells["speed"]; 
     speed_cell.Value = reply.RoundtripTime; 
    } 
} 
+0

ありがとう、私はC#の初心者です。これは、デリゲートを使用するための便利な例です。 – jean

関連する問題