C# .NET Core 2.1-我的代码未出现在VS2017堆栈跟踪中
我正在使用依赖注入(Microsoft.Extensions.DependencyInjection)开发一个.NET Core 2.1控制台应用程序。代码如下所示:C# .NET Core 2.1-我的代码未出现在VS2017堆栈跟踪中,c#,.net-core,visual-studio-2017,visual-studio-debugging,C#,.net Core,Visual Studio 2017,Visual Studio Debugging,我正在使用依赖注入(Microsoft.Extensions.DependencyInjection)开发一个.NET Core 2.1控制台应用程序。代码如下所示: class Program { static async Task Main(string[] args) { //... var configuration = GetConfiguration(); var serviceProvider = Configure
class Program
{
static async Task Main(string[] args)
{
//...
var configuration = GetConfiguration();
var serviceProvider = ConfigureServices(configuration);
var importer = serviceProvider.GetRequiredService<DataImporter>();
var result = await importer.ImportCentersAndStores(fileName);
//...
}
private static IConfigurationRoot GetConfiguration()
{
return new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
}
private static ServiceProvider ConfigureServices(IConfigurationRoot configuration)
{
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
return new ServiceCollection()
.AddLogging(builder =>
{
builder.AddConfiguration(configuration.GetSection("Logging"));
builder.AddConsole();
})
.AddOptions()
.AddAutoMapper()
.AddDatabase(configuration.GetConnectionString("Blah"))
.AddTransient<DataImporter>()
.BuildServiceProvider();
}
}
有人能解释一下吗?在第二个屏幕截图上:异常助手(弹出)->查看详细信息->堆栈跟踪。这将是在
async
启动之前引发异常时的正确堆栈跟踪
所以-是的-这种行为是因为你的
async
东西。老实说,这让我很好奇,为什么你会在控制台应用程序中执行任何异步
?Mike,有很多用例:1。显而易见的一点是:调用异步的东西。2.构建一个事件监听器(例如通过rabbitmq和wy进行通信)很简单:我正在注入和使用另一个程序集(ConfigureServices中的AddDatabase行)的内容。有一些异步的东西更容易从异步方法调用,但你是说这都是因为异步?但这通常不会产生这些后果…?我会放弃异步,看看会发生什么。@TorHaugen是的,如果你必须使用已经存在的异步方法,这是有意义的。我认为,如果您.RunSynchronously()
完成该任务,并且在适当的位置安装了符号,那么它应该可以工作。但是关于pumpkin所说的,这也取决于stop on exceptions(停止异常)对话框的设置。您可以使用CTRL+ALT+E
启用在CLR选项上停止所有异常,这样代码爆炸的位置将停止代码。堆栈跟踪是垃圾,由异步。。。因为代码正在另一个进程的另一个堆栈上运行。。线程的常见问题。我认为VS2019应该带来更好的东西。您还可以尝试启用源链接。。通过从Microsoft下载源代码,它可以让您进入这些dll的代码,但这仍然无法解决堆栈问题async
堆栈跟踪的问题实际上是由于开发人员的误解。堆栈跟踪不会告诉您代码来自何处,而且它从来没有告诉过您。堆栈跟踪告诉您代码返回的位置。碰巧这些对于同步代码是相同的,所以开发人员习惯了堆栈跟踪,告诉他们如何到达某个地方(即因果链)。在异步世界中,因果链和堆栈跟踪是不同的东西;它们在同步世界中只有相同的值。
<LangVersion>7.1</LangVersion>