我試圖創建一個多線程應用程序,它將允許我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;
}
嘗試調用SetMaxThreads一些合理的價值 - 嘗試50 –
不幸的是,沒有工作,謝謝你的建議,但。 – Clu