2012-08-09 41 views
6

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.

Trả lời

12

Nhiệm vụ tiếp tục của bạn có một CancellationToken mà bạn hủy. Điều này có nghĩa là nhiệm vụ tiếp tục, trong khi không khởi động, đang bị hủy bỏ. Không chuyển mã thông báo đó đến thứ bạn không muốn hủy.

Hủy bỏToken có nghĩa là hủy toàn bộ biểu đồ hành động cùng một lúc. Bạn có thể loại trừ nội dung khỏi hủy bằng cách không chuyển mã thông báo.

+0

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

+1

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

Các vấn đề liên quan