检测到 DisconnectedContext - Threadpool 和 Ping

3
我正在尝试创建一个多线程应用程序,以便能够ping数千个主机,ping的结果将写入到richtextbox中。
在此应用程序执行后,一旦遍历了一千个左右的地址,我就会遇到以下异常:
检测到 DisconnectedContext 消息:进入 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 https://dev59.com/L1PTa4cB1Zd3GeqPkY4X
            // 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。 - Martin James
很遗憾那个方法没有起作用,不过还是谢谢你的建议。 - Clu
2个回答

3
AndyDing说的大部分是正确的...问题出在ScrollToCaret上...这让我疯掉了...我交换了

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

使用

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

问题解决了...在我的情况下,无法将RichTextBox替换为TextBox...需要不同的颜色/对齐方式等等...但是AndyDing帮助我找到了正确的方法。
干杯

1
我遇到了类似的“DisconnectedContext”失败,花了一天时间最终找出问题是由于RichTextBoxScrollToCaret()引起的。我用一个TextBox替换了它,它会自动滚动,所以它甚至没有一个ScrollToCaret()方法。幸运的是,我并不真正需要RichTextBox提供的那些额外功能,在我的应用程序中,一个TextBox就足够了。你可以试试看。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接