Tôi đang tìm kiếm một lý do tại sao .NET CancellingToken struct được giới thiệu cùng với lớp CancellingTokenSource. Tôi hiểu API được sử dụng như thế nào , nhưng cũng muốn hiểu tại sao nó được thiết kế theo cách đó.
Tức là tại sao chúng ta có:
var cts = new CancellationTokenSource();
SomeCancellableOperation(cts.Token);
...
public void SomeCancellableOperation(CancellationToken token) {
...
token.ThrowIfCancellationRequested();
...
}
thay vì trực tiếp chuyển CancellingTokenSource xung quanh như:
var cts = new CancellationTokenSource();
SomeCancellableOperation(cts);
...
public void SomeCancellableOperation(CancellationTokenSource cts) {
...
cts.ThrowIfCancellationRequested();
...
}
Đây có phải là một tối ưu hóa hiệu suất dựa trên thực tế là việc kiểm tra trạng thái hủy xảy ra thường xuyên hơn so với việc chuyển mã thông báo xung quanh?
Vì vậy, CancellingTokenSource có thể theo dõi và cập nhật CancellingTokens và đối với mỗi mã thông báo, kiểm tra hủy là truy cập trường địa phương?
Cho rằng một bool dễ bay hơi không có khóa là đủ trong cả hai trường hợp, tôi vẫn không thể hiểu tại sao điều đó sẽ nhanh hơn.
Cảm ơn!
Cảm ơn rất nhiều! Các kiến thức bên trong thực sự được đánh giá cao.
– Hoàng Mộng Quỳnh 09:48:25 20/05/2013Cảm ơn đã xác nhận câu trả lời của tôi!
– Tạ Đức Hải 05:21:11 08/11/2014stackoverflow.com/questions/39077497/ Từ Bạn có biết nên hết thời gian chờ mặc định cho luồng đầu vào của StreamSocket không? Khi tôi sử dụng Cancationtoken để hủy thao tác đọc, nó cũng đóng ổ cắm liên quan. Có thể có cách nào để khắc phục vấn đề này?
– Lý Diễm Quyên 06:10:23 24/08/2016@Mike - Chỉ tò mò: tại sao bạn không thể gọi một cái gì đó như throw IfCancnameRequested () trên CTS như bạn có thể trên CT?
– Tạ Việt Thắng 17:15:37 16/06/2017Họ có trách nhiệm khác nhau và không quá dài dòng để viết cts.Token.Throw IfCancnameRequested () vì vậy chúng tôi đã không thêm API người nghe trực tiếp trên CTS.
– Đặng Phương Dung 17:47:47 19/06/2017