2012-09-14 26 views
5

Lớp học của tôi có phương pháp tạo đối tượng Task<int> bằng cách sử dụng TaskCompletionSource<int>. Sau đó, nó thực hiện một số hoạt động không đồng bộ và đặt kết quả. Tôi cần phải biết liệu tôi có thể tin tưởng ContinueWith phương pháp của nhiệm vụ hay không:Làm thế nào để hủy bỏ một sự tiếp tục của công việc?

public Task<int> CalculateAsync() 
{ 
    var source = new TaskCompletionSource(); 
    DoSomeAsyncStuffAndSetResultOf(source); 

    source.Task.ContinueWith(t => Console.WriteLine("Is this reliable?")); 
    return source.Task; 
} 

người gọi của CalculateAsync phương pháp có thể làm điều gì đó với nhiệm vụ sản xuất và ngăn chặn sự tiếp nối của nó chạy?

Trả lời

4

Bạn có thể vượt qua CancellationToken vào các tình trạng quá tải khác nhau của ContinueWith ... đó sẽ là cách thành ngữ nhất của việc hủy bỏ việc tiếp tục, IMO.

Tôi không nghĩ rằng bạn có thể làm bất kỳ việc gì với nhiệm vụ cha mẹ để hủy các lần tiếp tục. Tôi hy vọng không, dù sao ...

EDIT: OK, có vẻ như bạn đang cố gắng không phải để điều đó xảy ra. Không, bạn không cần phải lo lắng. Trừ khi người gọi bằng cách nào đó có thể làm cho nhiệm vụ chạy mãi mãi mà không bao giờ hoàn thành, bị hủy bỏ hoặc bị lỗi, việc tiếp tục sẽ chạy.

+0

Ồ, tôi hiểu - không, sự tiếp tục sẽ luôn chạy (giả sử người gọi không thể bắt buộc nhiệm vụ đơn giản chạy mãi mãi, không bao giờ hoàn thành). –

+0

Đã xóa nhận xét sau khi tôi thấy chỉnh sửa của bạn. Nếu anh ta gọi Dispose trước khi tôi đặt kết quả của nhiệm vụ thì sao? –

+1

@ ŞafakGür: Theo tài liệu cho Task.Dispose, điều đó sẽ ném một InvalidOperationException. –

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