1

因此,经过 36 小时的研究和检查,我得到了它。

VS2012 是“进程已锁定页面”蓝屏后的原因。

我试图打开一个线程来获取我网络上的活动 IP(使用 C#)。显然,当您在线程处于活动状态时按下“停止”按钮时,窗口正在崩溃。

这是线程代码:

    private void Button_Click_2(object sender, RoutedEventArgs e)
    {

        var thread = new Thread(() => TryToConnect(targetsList));

        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
        thread.Join();

    }

    private static void TryToConnect(ListBox targetsList)
    {
        for (int i = 1; i < 3; i++)
        {
            Uri url = new Uri("http://192.168.1." + i.ToString());
            string pingurl = string.Format("{0}", url.Host);
            string host = pingurl;
            Ping p = new Ping();
            try
            {
                PingReply reply = p.Send(host, 3000);
                if (reply.Status == IPStatus.Success)
                {
                    ListBoxItem item = new ListBoxItem();
                    item.Content = "192.168.1." + i.ToString();
                    targetsList.Items.Add(item);
                    targetsList.Items.Refresh();
                }
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            //   Thread.Sleep(10);
        }
    }

如您所见,线程使用 Ping 255 次,因此需要时间才能完成。当我按下停止按钮时,显然 VS2012 调试过程会使 Windows 崩溃。每次我尝试它时,Windows 都会崩溃。(我的操作系统:Win7 64Bit)我说得对吗?如果不是,它可以修复吗?

4

2 回答 2

4

这是Visual Studio(显然是从 VS2010 开始)和课程的一个已知问题Ping

Microsoft 于 2012 年 6 月 2 日 09:11 发表
感谢您的反馈。这是 Ping 类使用的基础 Windows API 的一个已知问题。Windows 团队将确定如何最好地处理该问题。

于 2013-07-09T00:38:04.817 回答
0

在线程中直接操作 UI 会崩溃。你应该使用 Invoke 或 BeginInvoke。Invoke 是同步的。BeginInvoke 是异步的。

 this.Invoke(new EventHandler(delegate
        {
            ListBoxItem item = new ListBoxItem();
            item.Content = "192.168.1." + i.ToString();
            targetsList.Items.Add(item);
            targetsList.Items.Refresh();
        }));
于 2013-07-09T00:32:35.113 回答