我正在玩TPL并拥有这个简单的程序
class Program
{
static void Main(string[] args)
{
MainAsync().Wait();
}
static async Task MainAsync()
{
try
{
var tcs = new TaskCompletionSource<string>();
var canceled = tcs.TrySetCanceled();
var myCanceledTask = tcs.Task;
string result = "canceled";
if (myCanceledTask.IsCanceled)
{
result = await myCanceledTask;
}
else
{
Console.WriteLine("Couldn't cancel task.");
}
Console.WriteLine("ID: \t" + myCanceledTask.Id);
Console.WriteLine("Canceled: \t" + myCanceledTask.IsCanceled);
Console.WriteLine("Completed: \t" + myCanceledTask.IsCompleted);
Console.WriteLine("Faulted: \t" + myCanceledTask.IsFaulted);
Console.WriteLine("Status: \t" + myCanceledTask.Status);
Console.WriteLine("Result: \t" + result);
Console.ReadLine();
}
catch (Exception e)
{
var msg = "CANCELED ERROR";
throw new Exception(msg, e);
}
}
}
对我来说有趣的是,在调试时,这将通过以下行中的异常无限循环,按以下顺序排列:
result = await myCanceledTask
,然后点击throw new Exception(msg, e)
,然后点击MainAsync().Wait()
,最后暂停MainAsync().Wait()
。
此时我希望程序退出,但它似乎循环。我可以继续点击继续循环上面的各种休息。 Visual Studio永远不会退出调试模式。
知道为什么Visual Studio会以这种方式运行吗?如果我在没有调试的情况下运行程序,我会得到一个异常并且可以按预期关闭程序。