我刚看到3个关于TPL使用的例程,它们执行相同的工作; 这是代码:
public static void Main()
{
Thread.CurrentThread.Name = "Main";
// Create a task and supply a user delegate by using a lambda expression.
Task taskA = new Task( () => Console.WriteLine("Hello from taskA."));
// Start the task.
taskA.Start();
// Output a message from the calling thread.
Console.WriteLine("Hello from thread '{0}'.",
Thread.CurrentThread.Name);
taskA.Wait();
}
public static void Main()
{
Thread.CurrentThread.Name = "Main";
// Define and run the task.
Task taskA = Task.Run( () => Console.WriteLine("Hello from taskA."));
// Output a …Run Code Online (Sandbox Code Playgroud) 根据文档 在任务被取消时Task.Run(Action, CancellationToken)抛出TaskCanceledException.
什么时候Task.Run(Action, CancellationToken)扔TaskCanceledException?目前尚不清楚抛出此异常必须满足哪些条件.
我正在深入研究这个async-await机制并观察到了一个TaskCanceledException我无法解释的问题.
在下面的示例中(自包含)我有声明
await Task.Run(() => null);
Run Code Online (Sandbox Code Playgroud)
我知道这个声明本身是无用的,但我把问题分开了,真正的代码有逻辑,在某些情况下返回null.
为什么这会抛出TaskCanceledException?如果我返回一个任意数字(在下面的例子中为5),它就不会抛出.
此外,如果我await的方法VS的调试器中断,但如果我不这样做await,那么只有一条消息写入VS的输出窗口.
internal class Program
{
private static void Main(string[] args)
{
var testAsync = new TestAsync();
// Exception thrown but the debugger does not step in. Only a message is logged to the output window
testAsync.TestAsyncExceptionOnlyInTheOutputWindow();
// Exception thrown and the debugger breaks
testAsync.TestAsyncExceptionBreaksIntoTheDebugger();
Console.ReadKey();
}
}
internal class TestAsync
{
public async void TestAsyncExceptionOnlyInTheOutputWindow()
{
TestNullCase();
}
public async void TestAsyncExceptionBreaksIntoTheDebugger() …Run Code Online (Sandbox Code Playgroud)