2013-12-11 87 views
3

我試圖創建一個多線程應用程序,它將允許我ping數千個主機,ping的結果被寫入richtextbox。DisconnectedContext被檢測到 - 線程池和Ping

後,該應用程序執行,一旦它通過一個千元左右的地址重複,我出現以下異常:檢測

DisconnectedContext 消息:過渡到COM方面0x4410e0這個RuntimeCallableWrapper失敗,出現以下錯誤:系統調用失敗。 (來自HRESULT的異常:0x80010100(RPC_E_SYS_CALL_FAILED))。這通常是因爲創建此RuntimeCallableWrapper的COM上下文0x4410e0已斷開連接,或者它忙於執行其他操作。從當前COM上下文釋放接口(COM上下文0x440f70)。這可能會導致損壞或數據丟失。爲了避免這個問題,請確保所有COM上下文/公寓/線程都保持活動狀態並可用於上下文轉換,直到應用程序完全使用表示其內部的COM組件的RuntimeCallableWrappers完成。

我不完全確定是什麼導致了這種情況,我起初認爲這是由於我沒有配置Ping,但自從解決了這個問題後,問題仍然存在。

如果有人有這方面的任何信息,將不勝感激。

謝謝大家。

public static void LogTextEvent(RichTextBox TextEventLog, Color TextColor, string EventText) 
    { 
     if (TextEventLog.InvokeRequired) 
     { 
      TextEventLog.BeginInvoke(new Action(delegate { LogTextEvent(TextEventLog, TextColor, EventText); })); 
      return; 
     } 

     string nDateTime = DateTime.Now.ToString("hh:mm:ss tt") + " - "; 

     // color text. 
     TextEventLog.SelectionStart = TextEventLog.Text.Length; 
     TextEventLog.SelectionColor = TextColor; 

     // newline if first line, append if else. 
     if (TextEventLog.Lines.Length == 0) 
     { 
      TextEventLog.AppendText(nDateTime + EventText); 
      TextEventLog.ScrollToCaret(); 
      TextEventLog.AppendText(Environment.NewLine); 
     } 
     else 
     { 
      TextEventLog.AppendText(nDateTime + EventText + Environment.NewLine); 
      TextEventLog.ScrollToCaret(); 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     string[] logFile = File.ReadAllLines("addrs.txt"); 
     var addresses = new List<string>(logFile); 

     foreach (string ip in addresses) 
     { 
      // See http://stackoverflow.com/questions/4744630/unexpected-behaviour-for-threadpool-queueuserworkitem 
      // for reason to use another variable in the loop 
      string loopIp = ip; 
      WaitCallback func = delegate 
       { 
        if (PingIP(loopIp)) 
        { 
         LogTextEvent(richTextBox1, Color.Green, "[ " + loopIp.ToUpper() + " ] - Ping Success"); 
        } 
        else 
        { 
         LogTextEvent(richTextBox1, Color.Red, "[ " + loopIp.ToUpper() + " ] - Ping FAIL!"); 
        } 
       }; 

      ThreadPool.QueueUserWorkItem(func); 
     } 
    } 

    public static bool PingIP(string IP) 
    { 
     bool result = false; 
     var ping = new Ping(); 
     try 
     { 
      //var ping = new Ping(); 
      PingReply pingReply = ping.Send(IP); 

      if (pingReply.Status == IPStatus.Success) 
       result = true; 
     } 
     catch 
     { 
      result = false; 
     } 
     finally 
     { 
      ping.Dispose(); 
     } 
     return result; 
    } 
+0

嘗試調用SetMaxThreads一些合理的價值 - 嘗試50 –

+0

不幸的是,沒有工作,謝謝你的建議,但。 – Clu

回答

3

AndyDing大多是正確的...問題是ScrollToCaret ......這可把我惹火...... 我換

​​

rtbox.Focus(); 
rtbox.Select(rtbox.Text.Length, 0); 

問題就迎刃而解了。在我情況交換RichTextBox for TextBox是不可能的......需要不同的顏色/對齊bla bla bla ...但AndyDing讓我走上了正確的道路。

乾杯

1

我遇到了類似的「DisconnectedContext」失敗,花了一天,終於找出問題是由RichTextBoxScrollToCaret()引起的。我用TextBox代替它,它會自動向下滾動,所以它甚至沒有ScrollToCaret()方法。幸運的是,我並不需要RichTextBox提供的額外功能,TextBox在我的應用程序中很好。你可以試試看。