C# .Net Core-调试时应用程序崩溃
发生了一些非常奇怪的事情。如果在某一行代码后放置断点,调试时,调试会话将停止,就像我按下停止按钮一样。 真正奇怪的是,如果我完全跳过这个函数,跳过它,代码就不会崩溃 我使用的是.Net Core 2,在任何VS windows和Mac上运行完全更新的VS For Mac,使用的是C 7.1 代码如下:C# .Net Core-调试时应用程序崩溃,c#,.net-core,visual-studio-mac,C#,.net Core,Visual Studio Mac,发生了一些非常奇怪的事情。如果在某一行代码后放置断点,调试时,调试会话将停止,就像我按下停止按钮一样。 真正奇怪的是,如果我完全跳过这个函数,跳过它,代码就不会崩溃 我使用的是.Net Core 2,在任何VS windows和Mac上运行完全更新的VS For Mac,使用的是C 7.1 代码如下: var connectionToUse = new SqlConnection(string.Format(str, dbName)); try {
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:
显然等待声明有问题。我发现代码将在随后的第一次等待中崩溃,无论它在哪里我有点明白了。。。我正在使用Task.StartNew跨越新线程。更改为“任务”后,“运行”开始正常工作。无法找出调试会话为何崩溃。。。由于代码按预期工作,我接受这个答案。数据库存在吗?调试代码时,是否使用了相关appsettings.json文件中的连接字符串,与未调试运行代码时使用的连接字符串相同?@JamieTaylor是的,如果不使用异步版本,则数据库存在,代码按预期工作。可能是调试程序错误。我将在上报告它,并附加IDE日志和调试器输出。另外,如果可能的话,一个小的复制项目也会很有用。@MattWard damn,这也发生在VS 2017 for windows上……StartNew使用当前的同步上下文,因此您的工作可能最终会在UI线程上运行,更多信息如下: