Từ những gì tôi đã đọc về Công việc, mã sau đây sẽ hủy tác vụ hiện đang thực hiện mà không cần ném ngoại lệ. Tôi đã ấn tượng rằng toàn bộ vấn đề hủy bỏ nhiệm vụ là lịch sự "yêu cầu" nhiệm vụ dừng lại mà không hủy bỏ chủ đề.Hủy tác vụ đang ném một ngoại lệ
Kết quả của chương trình sau đây là:
bán phá giá ngoại lệ
[OperationCanceledException]
hủy và trở về thủ tính toán cuối cùng.
Tôi đang cố tránh mọi ngoại lệ khi hủy. Làm thế nào tôi có thể thực hiện điều này?
void Main()
{
var cancellationToken = new CancellationTokenSource();
var task = new Task<int>(() => {
return CalculatePrime(cancellationToken.Token, 10000);
}, cancellationToken.Token);
try
{
task.Start();
Thread.Sleep(100);
cancellationToken.Cancel();
task.Wait(cancellationToken.Token);
}
catch (Exception e)
{
Console.WriteLine("Dumping exception");
e.Dump();
}
}
int CalculatePrime(CancellationToken cancelToken, object digits)
{
int factor;
int lastPrime = 0;
int c = (int)digits;
for (int num = 2; num < c; num++)
{
bool isprime = true;
factor = 0;
if (cancelToken.IsCancellationRequested)
{
Console.WriteLine ("Cancelling and returning last calculated prime.");
//cancelToken.ThrowIfCancellationRequested();
return lastPrime;
}
// see if num is evenly divisible
for (int i = 2; i <= num/2; i++)
{
if ((num % i) == 0)
{
// num is evenly divisible -- not prime
isprime = false;
factor = i;
}
}
if (isprime)
{
lastPrime = num;
}
}
return lastPrime;
}
Nếu bạn đang cố gắng tránh trường hợp ngoại lệ, bạn không nên nâng cấp một với ThrowIfCancellationRequested. Chỉ cần trở về duyên dáng từ CalculatePrime. –
Tôi đã xóa cancelToken.ThrowIfCancellationRequested(); và tôi vẫn nhận được kết quả tương tự. –
Không chuyển mã thông báo hủy của bạn sang Task.wait vì bạn đã yêu cầu hủy tác vụ. Gọi Task.wait() để thay thế. –