Tôi có ứng dụng Dịch vụ Windows sử dụng một số Threading.Timer
và TimerCallback
để thực hiện một số quy trình trong các khoảng thời gian cụ thể. Tôi cần phải khóa mã xử lý này xuống chỉ còn 1 luồng tại một thời điểm.Sử dụng khóa với Luồng.Timer
Ví dụ: dịch vụ được bắt đầu và cuộc gọi lại đầu tiên được kích hoạt và chuỗi được bắt đầu và bắt đầu xử lý. Điều này hoạt động ok miễn là quá trình xử lý được hoàn thành trước lần gọi lại tiếp theo. Vì vậy, ví dụ như quá trình xử lý mất nhiều thời gian hơn bình thường và TimerCallback được kích hoạt một lần nữa trong khi một luồng khác đang xử lý, tôi cần phải đợi cho đến khi chuỗi khác được thực hiện.
Dưới đây là một mẫu mã của tôi:
static Timer timer;
static object locker = new object();
public void Start()
{
var callback = new TimerCallback(DoSomething);
timer = new Timer(callback, null, 0, 10000);
}
public void DoSomething()
{
lock(locker)
{
// my processing code
}
}
Đây có phải là một cách an toàn để làm điều này? Điều gì sẽ xảy ra nếu hàng đợi được khá đáng kể? Có lựa chọn nào tốt hơn không?
Ý tưởng hay khi kích hoạt bộ hẹn giờ không bao giờ nghĩ về nó theo cách đó. Kịch bản thứ hai, điều này có nghĩa là luồng chỉ đơn giản là thoát và không đợi? – James
Vâng, trong kịch bản thứ hai, TryEnter sẽ trả về ngay lập tức nếu có một luồng khác hiện đang trong mã xử lý, vì vậy nó bỏ qua khoảng thời gian hẹn giờ đó một cách hiệu quả. –
Điều này nên làm các trick, cảm ơn. – James