Normalerweise poste ich keine Frage mit der Antwort, aber dieses Mal möchte ich einige Aufmerksamkeit auf etwas lenken, was ich denke, ein unklares aber allgemeines Problem sein könnte. Es wurde von this question ausgelöst, seitdem habe ich meinen eigenen alten Code überprüft und festgestellt, dass davon auch einiges betroffen war.Faulted vs Canceled Aufgabenstatus nach CancellationToken.ThrowIfCancellationRequested
Der folgende Code beginnt und wartet auf zwei Aufgaben, task1
und task2
, die fast identisch sind. task1
unterscheidet sich nur von task2
darin, dass es eine nie endende Schleife ausführt. IMO, beide Fälle sind ziemlich typisch für einige reale Szenarien, die CPU-gebundene Arbeit ausführen.
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication
{
public class Program
{
static async Task TestAsync()
{
var ct = new CancellationTokenSource(millisecondsDelay: 1000);
var token = ct.Token;
// start task1
var task1 = Task.Run(() =>
{
for (var i = 0; ; i++)
{
Thread.Sleep(i); // simulate work item #i
token.ThrowIfCancellationRequested();
}
});
// start task2
var task2 = Task.Run(() =>
{
for (var i = 0; i < 1000; i++)
{
Thread.Sleep(i); // simulate work item #i
token.ThrowIfCancellationRequested();
}
});
// await task1
try
{
await task1;
}
catch (Exception ex)
{
Console.WriteLine(new { task = "task1", ex.Message, task1.Status });
}
// await task2
try
{
await task2;
}
catch (Exception ex)
{
Console.WriteLine(new { task = "task2", ex.Message, task2.Status });
}
}
public static void Main(string[] args)
{
TestAsync().Wait();
Console.WriteLine("Enter to exit...");
Console.ReadLine();
}
}
}
Die Geige is here. Der Ausgang:
{ task = task1, Message = The operation was canceled., Status = Canceled } { task = task2, Message = The operation was canceled., Status = Faulted }
Warum der Status task1
Cancelled
ist, aber der Status von task2
ist Faulted
? Hinweis, in beiden Fällen tue ich nicht pass token
als 2. Parameter zu Task.Run
.
Ich bin froh:
Der richtige Code für
task1
sollte diese sein. – i3arnon@ l3arnon, es war in der Tat ein großer Beitrag, beide tatsächlich. – Noseratio