.Net Core - 调试过程中应用程序崩溃

3

发生了一些奇怪的事情。如果我在某行代码后面设置断点,在调试时,调试会停止,就好像我按下了“停止”按钮。
真正奇怪的是,如果我完全跳过该函数,跳过它,代码就不会崩溃...

我正在使用 .Net Core 2,在任何 VS 上(Windows 和 Mac)运行,使用 C# 7.1

以下是代码:

        var connectionToUse = new SqlConnection(string.Format(str, dbName));
        try
        {
            SqlCommand command = new SqlCommand();
            command.Connection = connectionToUse;
            command.CommandText = @"SELECT * from myTable";
            await connectionToUse.OpenAsync(); //CANT GET PAST THIS LINE HERE
            var r1 = await command.ExecuteReaderAsync();
            while (await r1.ReadAsync())
            {
                //MORE CODE
            }
            r1.Close();
            await Task.Delay(15000);
        }
        catch (Exception ex)
        {
            //NEVER ENTERS HERE
        }
        finally
        {
            if (connectionToUse.State != ConnectionState.Closed)
            {
                connectionToUse.Close();
            }
        }

编辑1:
使用.Open(),不使用异步,效果完美。但问题转移到了r1.ReadAsync()这一行……

编辑2:
在那段代码之前,以下代码可以正常运行

    private async Task<Dictionary<int, string>> MapDatabases()
    {
        Dictionary<int, string> databases = new Dictionary<int, string>();

        SqlConnection mainConn = new SqlConnection(string.Format(str, "Master"));
        SqlCommand command = new SqlCommand();
        command.CommandText = "SELECT name,database_id FROM sys.databases WHERE database_id = 5";
        command.Connection = mainConn;
        try
        {
            await mainConn.OpenAsync();
            SqlDataReader reader = await command.ExecuteReaderAsync();
            while (await reader.ReadAsync())
            {
                databases.Add(reader.GetInt32(1), reader.GetString(0));
            }
            reader.Close();
            mainConn.Close();
        }
        finally
        {
            if (mainConn.State != ConnectionState.Closed)
            {
                mainConn.Close();
            }
        }
        return databases;
    }
编辑3:
在完全更新的VS 2017上也可以重现该问题。 编辑4:
显然await语句出现了问题。我发现代码将崩溃在第一个后续的await,无论它在哪里。

数据库存在吗?当您调试代码时,它是否使用与在没有调试运行时相同的连接字符串(来自相关的appsettings.json文件)? - Jamie Taylor
@JamieTaylor 是的,如果我不使用异步版本,数据库是存在的,代码也按预期工作。 - Leonardo
可能是调试器的一个问题。我会在Visual Studio for Mac开发者论坛上报告此问题,并附上IDE日志和调试器输出。如果可能的话,还可以提供一个小的重现项目,这也会很有用。 - Matt Ward
@MattWard 真糟糕,这也发生在 Windows 上的 VS 2017 上... - Leonardo
1个回答

1

我有点明白了......我使用 Task.StartNew 来跨越新线程。改用 Task.Run 后,事情开始正常工作了。不过我还是想不通为什么调试会崩溃......既然代码能够按预期工作,我就接受这个答案了。


StartNew 使用 Current 同步上下文,因此您的工作(可能)最终会在 UI 线程上运行,更多信息请参见:https://blog.stephencleary.com/2013/08/startnew-is-dangerous.html - VMAtm

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