2011-01-11 74 views
1

我希望能夠正確解釋。我正在開發一個每X分鐘運行6000多個同步異步ping的項目。如果我嘗試從Windows窗體上的按鈕運行組件,它就可以工作。但是如果你從一個「Threading.Timer」開始就會遇到問題。有時候應用程序會等待ping的答案,並且當你訪問一個我不能爲null的變量時,有時會拋出NullReferenceException異常。但是,如果從用戶請求表單上的按鈕執行正常工作。C#異步Ping:從Threading.Timer不工作

我希望有人能幫助我。

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

我們需要您的代碼 – Nickolodeon 2011-01-11 09:38:24

回答

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」的方式來獲得你的重播。現在破壞方法「PingResult」使用參數「發件人」(參照平)如下每個對象「平」:

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

這對我的作品。我希望它能幫助別人。

問候和非常感謝你的一切!