Thông thường tôi không đăng câu hỏi với câu trả lời, nhưng lần này tôi muốn thu hút sự chú ý đến những gì tôi nghĩ có thể là một vấn đề không rõ ràng. Nó được kích hoạt bởi this question, kể từ đó tôi xem xét mã cũ của riêng mình và thấy một số mã bị ảnh hưởng bởi điều này.Trạng thái tác vụ bị lỗi và bị hủy sau khi hủy bỏ.ThrowIfCancellationRequested
Mã bên dưới bắt đầu và đang chờ hai tác vụ, task1
và task2
, hầu như giống hệt nhau. task1
chỉ khác với task2
ở chỗ nó chạy một vòng lặp không bao giờ kết thúc. IMO, cả hai trường hợp đều khá điển hình đối với một số tình huống thực tế trong cuộc sống thực hiện công việc liên kết CPU.
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();
}
}
}
Fiddle is here. Kết quả:
{ task = task1, Message = The operation was canceled., Status = Canceled } { task = task2, Message = The operation was canceled., Status = Faulted }
Tại sao tình trạng của task1
là Cancelled
, nhưng tình trạng của task2
là Faulted
? Lưu ý, trong cả hai trường hợp, tôi làm không vượt qua token
làm thông số thứ 2 cho Task.Run
.
Tôi rất vui vì bài viết của tôi bị khiêu khích câu hỏi của bạn. – i3arnon
@ l3arnon, đó thực sự là một bài đăng tuyệt vời, cả hai đều trên thực tế. – Noseratio