Visual Studio 2015 Debug在多线程应用程序中不起作用

Art*_*lus 12 c# debugging multithreading visual-studio-debugging visual-studio-2015

In my project I have a heavy part of code that should be executed on a separate thread without blocking UI. When debugger hits the breakpoint inside this code, VS2015 freezes for 5-10 seconds. After that, if I try to continue debug (by pressing Step Over, Step In or Continue), the app goes from paused state to working state, Debugging Tools are ticking, but nothing happens and there's 0% of CPU utilization. If I press Break All then, the "cursor" (don't know the correct term) is shown at Application.Run( new Form1() ); in Program.cs where Main() is.

As I'm pretty new to C#, I thought that there was some problem with my approach to multithreading, but apparently it happens whatever I try - using async/await with Tasks, using BackgroundWorker component, or simple new Thread(myFunc).Start().

Just to be clear.

  • 代码本身非常好用.
  • 调试器本身也可以工作,在主线程中的断点上没有冻结和"死锁".如果我从主线程启动代码 - 一切都很好.
  • 我还在一个全新的解决方案中检查了一个简单的for ( int i = 0; i < Int32.MaxValue; ++i )功能 - 同样的问题.
  • 还检查了不同版本的.NET:4.6,4.5,4.0.到处都是.
  • 这个问题既没有出现在VS2010(我之前使用过)中,也没出现在VS2013中(我试图确保它是VS2015的问题).但是,我的朋友使用相同的VS2015也没有这个问题.

编辑:每个请求,测试表的代码,我不断得到问题.只有三个按钮,标签和BackgroundWorker.整体方案类似于主项目的代码.

    public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    const int period = 10000;
    void FuncAsync(IProgress<int> progress)
    {
        for ( int i = 0; i < Int32.MaxValue; ++i )
        {
            double part = (double)i / Int32.MaxValue;
            int percent = (int)(part * 100.0);

            if ( (i % period) == 0 )
                progress.Report( percent );
        }
    }
    void FuncBW(BackgroundWorker worker)
    {
        for ( int i = 0; i < Int32.MaxValue; ++i )
        {
            double part = (double)i / Int32.MaxValue;
            int percent = (int)(part * 100.0);

            if ( (i % period) == 0 )
                worker.ReportProgress( percent );
        }
    }
    void FuncThread()
    {
        for ( int i = 0; i < Int32.MaxValue; ++i )
        {
            double part = (double)i / Int32.MaxValue;
            int percent = (int)(part * 100.0);

            if ( (i % period) == 0 )
                label1.Text = percent.ToString();
            //yes, this one will cause exception of accessing UI from different thread
            //if i press "Break" in the exception window, i will also get a 10sec freeze
        }
    }



    private async void button1_Click(object sender, EventArgs e)
    {
        var progress = new Progress<int>(i => label1.Text = i.ToString() );
        await Task.Factory.StartNew( () => FuncAsync( progress ),
                                    TaskCreationOptions.LongRunning );
    }

    private void button2_Click(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();
    }

    private void button3_Click(object sender, EventArgs e)
    {
        Thread t = new Thread(FuncThread);
        t.Start();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        FuncBW( (BackgroundWorker)sender );
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        label1.Text = e.ProgressPercentage.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 23

在调试多线程WinForms应用程序时,我遇到了VS2015冻结(无限期)的类似问题.

我在VS2013中调试相同的代码没有问题.

当我禁用VS主机进程(项目 - >属性 - >调试 - >启用Visual Studio主机进程)时,问题似乎消失了.

希望对别人有用.

  • 非常感谢!真的有帮助! (2认同)