tôi đã xác định công tác sauContinueWith một hủy nhiệm vụ
var t = Task.Factory.StartNew(
() => LongRunningMethod(cancellationToken),
cancellationToken
);
t.ContinueWith(
Callback,
cancellationToken,
TaskContinuationOptions.None,
TaskScheduler.FromCurrentSynchronizationContext()
);
Bên trong LongRunningMethod
, tôi kiểm tra nếu token hủy có hủy bỏ yêu cầu, và nếu như vậy, tôi trở về từ phương pháp này. Điều đó hoạt động tốt.
Tuy nhiên, cuộc gọi lại không được gọi trong trường hợp này. Gọi lại không được gọi nếu tôi thay thế dòng thứ hai ở trên với
t.ContinueWith(
x => Callback(x, cancellationToken),
TaskScheduler.FromCurrentSynchronizationContext()
);
Trong tình huống này, nhiệm vụ vẫn nghĩ nó chạy đến khi kết thúc.
Tại sao cuộc gọi đầu tiên không hoạt động? Tôi đã có ấn tượng rằng TaskContinuationOptions.None
có nghĩa là cuộc gọi lại sẽ được gọi bất kể trạng thái của luồng.
tôi đang hủy Task bằng cách gọi:
_cancellationTokenSource.Cancel();
Trên một lưu ý phần nào liên quan, cần phải vượt qua xung quanh tokens hủy vẻ giống như một lỗ hổng thiết kế chính của thư viện công tác.
Sau đó, TaskContinuationOptions không làm gì? Nếu tôi nói TaskContinuationOptions.OnlyOnCancelled, điều đó cũng không hoạt động. – user981225
TaskContinuationOptions cung cấp một cách để không thực thi nếu nhiệm vụ * parent * bị hủy bỏ. Tham số CancellationToken là độc lập. – usr