C# 检测到DisconnectedContext-线程池和Ping

C# 检测到DisconnectedContext-线程池和Ping,c#,multithreading,threadpool,C#,Multithreading,Threadpool,我正在尝试创建一个多线程应用程序,它将允许我ping数千台主机,ping的结果将写入richtextbox 在这个应用程序执行之后,一旦它遍历了大约一千个地址,就会出现以下异常: 检测到DisconnectedContext 消息:此RuntimeCallableWrapper转换到COM上下文0x4410e0失败,错误如下:系统调用失败。(来自HRESULT的异常:0x80010100(RPC_E_系统_调用_失败))。这通常是因为创建此RuntimeCallableWrapper的COM上下

我正在尝试创建一个多线程应用程序,它将允许我ping数千台主机,ping的结果将写入richtextbox

在这个应用程序执行之后,一旦它遍历了大约一千个地址,就会出现以下异常:

检测到DisconnectedContext 消息:此RuntimeCallableWrapper转换到COM上下文0x4410e0失败,错误如下:系统调用失败。(来自HRESULT的异常:0x80010100(RPC_E_系统_调用_失败))。这通常是因为创建此RuntimeCallableWrapper的COM上下文0x4410e0已断开连接或正在忙于执行其他操作。从当前COM上下文(COM上下文0x440f70)释放接口。这可能会导致损坏或数据丢失。为了避免此问题,请确保所有COM上下文/单元/线程都保持活动状态,并可用于上下文转换,直到应用程序完全使用表示活动在其中的COM组件的RuntimeCallableWrapper

我不完全确定这是什么原因造成的,起初我认为这是由于我没有处理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;
    }
publicstaticvoidlogtextEvent(RichTextBox TextEventLog、colortextColor、stringeventText)
{
if(TextEventLog.invokererequired)
{
BeginInvoke(新操作(委托{LogTextEvent(TextEventLog,TextColor,EventText);});
返回;
}
字符串nDateTime=DateTime.Now.ToString(“hh:mm:ss tt”)+“-”;
//彩色文本。
TextEventLog.SelectionStart=TextEventLog.Text.Length;
TextEventLog.SelectionColor=TextColor;
//换行符(如果为第一行),附加符(如果为其他行)。
if(TextEventLog.Lines.Length==0)
{
TextEventLog.AppendText(nDaTime+EventText);
TextEventLog.ScrollToCaret();
TextEventLog.AppendText(Environment.NewLine);
}
其他的
{
TextEventLog.AppendText(nDaTime+EventText+Environment.NewLine);
TextEventLog.ScrollToCaret();
}
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
string[]logFile=File.ReadAllLines(“addrs.txt”);
var地址=新列表(日志文件);
foreach(地址中的字符串ip)
{
//看http://stackoverflow.com/questions/4744630/unexpected-behaviour-for-threadpool-queueuserworkitem
//以了解在循环中使用另一个变量的原因
字符串loopIp=ip;
WaitCallback func=委托
{
if(PingIP(loopIp))
{
LogTextEvent(richTextBox1,Color.Green,“[”+loopIp.ToUpper()+“]-Ping成功”);
}
其他的
{
LogTextEvent(richTextBox1,Color.Red,“[”+loopIp.ToUpper()+“]-Ping失败!”);
}
};
ThreadPool.QueueUserWorkItem(func);
}
}
公共静态bool PingIP(字符串IP)
{
布尔结果=假;
var ping=新ping();
尝试
{
//var ping=新ping();
PingReply PingReply=ping.Send(IP);
if(pingReply.Status==IPStatus.Success)
结果=真;
}
抓住
{
结果=假;
}
最后
{
ping.Dispose();
}
返回结果;
}

我遇到了类似的“
断开上下文连接
”故障,并花了一天时间终于弄清楚问题是由
RichTextBox
ScrollToCaret
()引起的。我用一个自动向下滚动的
TextBox
替换了它,因此它甚至没有
scrolltocare
()方法。幸运的是,我并不真的需要
RichTextBox
提供的那些额外功能,在我的应用程序中,文本框很好。你可以试一试。

而伊丁基本上是对的。。。问题是ScrollToCaret。。。这让我发疯。。。 我交换了

rtbox.Select(box.Text.Length, 0);
rtbox.ScrollToCaret();

问题解决了。。。在我的情况下,用RichTextBox替换TextBox是不可能的。。。需要不同的颜色/对齐bla bla bla。。。但安迪丁让我走上了正确的道路


干杯

试着用一些合理的值调用SetMaxThreads-试试50。不幸的是,这不起作用,不过谢谢你的建议。
rtbox.Focus();
rtbox.Select(rtbox.Text.Length, 0);