我有一个方法,例如Task<string> GetContentAsync(string url),我的控制台应用程序还没有完全准备好在内部利用TPL,但可能在以后它会.
如何为这个(或其他)方法轻松编写同步包装器(不是替代实现)?
如标题所示:控制台应用程序在执行以下行时崩溃
disco = await DiscoveryClient.GetAsync("http://localhost:5000");
Run Code Online (Sandbox Code Playgroud)
没有抛出异常,即使我将它包装在try catch调试中也只是断线;输出中没有相关信息。Visual Studio 只是停止调试应用程序并返回到编辑模式。
有人遇到过类似的事情吗?:( 我可以尝试做什么?
我使用的是VS2015,控制台应用程序是.NETCoreApp v1.0,使用“IdentityModel”:“2.0.0-rc6”;。Identity Server 4 在 localhost:5000、.NETCoreApp v1.0 上运行。
GetAsync使用https://demo.identityserver.io参数调用方法也会导致所描述的错误。
我正在关注本教程:https://identityserver4.readthedocs.io/en/dev/quickstarts/1_client_credentials.html
我很难理解 async/await 在各种非快乐路径情况下如何工作。例如,我有以下代码:
class Program
{
static void Main(string[] args)
{
Do();
Console.ReadLine();
}
private static void Do()
{
TaskScheduler.UnobservedTaskException += (s, e) =>
{
Console.WriteLine($"Unobserved Exception : {e.Exception.Message}");
e.SetObserved();
};
try
{
ThrowsAsync();
}
catch (Exception ex)
{
Console.WriteLine($"Caught in try/catch : {ex.Message}");
}
}
private static async Task ThrowsAsync()
{
Console.WriteLine("Throwing");
throw new Exception("FAILURE");
}
}
Run Code Online (Sandbox Code Playgroud)
有两件事我不明白:
ThrowsAsync方法是异步的,但是,它不包含任何await. 我假设在这种情况下该方法将像“正常”同步方法一样执行。然而,它抛出的异常永远不会被catch块捕获。TaskScheduler.UnobservedTaskException. 然而,它永远不会被执行。这是为什么?我知道如果我等待,异常就会被捕获ThrowsAsync。不过,我正在尝试更好地了解它的工作原理。
我正在使用 .NET 5 和基于 Linux 的操作系统运行该代码。