我正在尝试创建一个多线程应用程序,它允许我ping数千个主机,ping的结果被写入richtextbox。
在此应用程序执行后,一旦它遍历了大约一千个地址,我就会遇到以下异常:
检测到DisconnectedContext 消息:为此RuntimeCallableWrapper转换到COM上下文0x4410e0失败,并显示以下错误:系统调用失败。 (来自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 :(得分:3)
AndyDing大部分是正确的...问题出在ScrollToCaret ......这让我很生气...... 我换了
rtbox.Select(box.Text.Length, 0);
rtbox.ScrollToCaret();
与
rtbox.Focus();
rtbox.Select(rtbox.Text.Length, 0);
问题解决了...在我的情况下交换RichTextBox for TextBox是不可能的......需要不同的颜色/对齐bla bla bla ...但是AndyDing让我走上了正确的道路。
干杯
答案 1 :(得分:1)
我遇到了类似的&#34; DisconnectedContext
&#34;失败了,花了一天时间才最终弄明白问题是ScrollToCaret
()RichTextBox
引起的。我将其替换为TextBox
,它会自动向下滚动,因此它甚至没有ScrollToCaret
()方法。幸运的是,我并不真正需要RichTextBox
提供的额外功能,TextBox在我的应用程序中表现得很好。你可以尝试一下。