VS2012 Is A BSOD Causer

本文关键字:Causer BSOD Is VS2012 | 更新日期: 2023-09-27 18:21:39

所以经过36个小时的研究和检查,我得到了它。

VS2012是"进程已锁定页面"BSOD之后的原因

我试图打开一个线程来获取网络上的活动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 64位)我说得对吗?如果没有,它可以修复吗?

VS2012 Is A BSOD Causer

这是Visual Studio(显然是自VS2010以来)和Ping类的已知问题。

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

在线程中直接操作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();
        }));