2011-01-11 29 views
1

私は正しく説明したいと思います。私はX分ごとに6000を超える同時非同期pingを実行するプロジェクトに取り組んでいます。 Windowsフォーム上のボタンからコンポーネントを実行しようとすると、そのコンポーネントは機能します。しかし、あなたが "Threading.Timer"から始めると、それには問題があります。時にはアプリケーションがpingへの応答を待っていることがあり、nullにできない変数にアクセスするとNullReferenceException例外がスローされることがあります。しかし、ユーザーリクエストフォーム上のボタンから実行するとうまく動作します。C#Async Ping:Threading.Timerから機能しない

誰かが私を助けてくれることを願っています。

using System.Net.NetworkInformation; 
using System.Threading; 
+0

コードが必要です – Nickolodeon

+0

コードの残りの部分を忘れました。最初の2行だけを投稿しました。 –

+0

未登録の3つのアカウントをマージしました。あなたの答えは受け入れられているとマークしてください。おそらく以前はできなかったでしょう。 –

答えて

4

最初の推測では、あなたのクラス内のGUIをいくつか更新すると言います。すべてのボタンが正常に動作するため、タスクはGUIスレッド内で実行され、問題なくすべてのものにアクセスできます。独自のスレッドにタスクをアウトソースする場合は、GUIに直接アクセスする必要はありません。

これを解決するには、guiコールを(Begin)Invoke()コールにラップすることができます(これらのコマンドの詳細については、hereを参照してください)。それが少し楽にするために、あなたはまた、これらの拡張メソッドのいずれかを使用できます。

public static class ControlExtensions 
{ 
    public static void InvokeIfRequired(this Control c, Action<Control> action) 
    { 
     if (c.InvokeRequired) 
     { 
      c.Invoke(new Action(() => action(c))); 
     } 
     else 
     { 
      action(c); 
     } 
    } 

    public static void BeginInvokeIfRequired(this Control c, Action<Control> action) 
    { 
     if (c.InvokeRequired) 
     { 
      c.BeginInvoke(new Action(() => action(c))); 
     } 
     else 
     { 
      action(c); 
     } 
    } 
} 

使用量は次のようになります。

myTextBox.InvokeIfRequired((ctrl) => ctrl.Text == "SomeNewText"); 
0

あなたの助けのためにすべてをありがとう!私は解決策を見つけました。私がしたことは、あなたがあなたのリプレイを受け取るためにオブジェクト「ping」を破壊する方法を変えたことでした。

((Ping)sender).PingCompleted -= PingResult; 
((IDisposable)sender).Dispose(); 

これは私の作品:今すぐメソッド「PingResult」パラメータ「差出人」を使用して、以下のように(pingを参照)内の各オブジェクト「ピング」を破壊します。私はそれが他人を助けることを望む。

挨拶をしてくれてありがとう!

関連する問題