Tôi muốn chạy một Task có "heartbeat" tiếp tục chạy tại một khoảng thời gian cụ thể cho đến khi tác vụ hoàn tất.Tạo một nhiệm vụ với nhịp tim
Tôi đang nghĩ đến một phương pháp mở rộng như thế này sẽ làm việc tốt:
public static async Task WithHeartbeat(this Task primaryTask, TimeSpan heartbeatInterval, Action<CancellationToken> heartbeatAction, CancellationToken cancellationToken)
Ví dụ:
public class Program {
public static void Main() {
var cancelTokenSource = new CancellationTokenSource();
var cancelToken = cancelTokenSource.Token;
var longRunningTask = Task.Factory.StartNew(SomeLongRunningTask, cancelToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
var withHeartbeatTask = longRunningTask.WithHeartbeat(TimeSpan.FromSeconds(1), PerformHeartbeat, cancelToken);
withHeartbeatTask.Wait();
Console.WriteLine("Long running task completed!");
Console.ReadLine()
}
private static void SomeLongRunningTask() {
Console.WriteLine("Starting long task");
Thread.Sleep(TimeSpan.FromSeconds(9.5));
}
private static int _heartbeatCount = 0;
private static void PerformHeartbeat(CancellationToken cancellationToken) {
Console.WriteLine("Heartbeat {0}", ++_heartbeatCount);
}
}
Chương trình này nên đầu ra:
Starting long task
Heartbeat 1
Heartbeat 2
Heartbeat 3
Heartbeat 4
Heartbeat 5
Heartbeat 6
Heartbeat 7
Heartbeat 8
Heartbeat 9
Long running task completed!
Lưu ý rằng nó không nên (trong trường hợp bình thường) đầu ra "Heartbeat 10" vì nhịp tim bắt đầu sau thời gian chờ ban đầu (tức là 1 giây). Tương tự, nếu tác vụ mất ít thời gian hơn khoảng nhịp tim, thì nhịp tim sẽ không xảy ra chút nào.
Cách tốt để thực hiện điều này là gì?
Thông tin cơ bản: Tôi có dịch vụ đang nghe hàng đợi Azure Service Bus. Tôi không muốn Complete thông báo (sẽ xóa vĩnh viễn thư đó khỏi hàng đợi) cho đến khi tôi xử lý xong, có thể mất nhiều thời gian hơn thông báo tối đa LockDuration trong 5 phút. Vì vậy, tôi cần sử dụng cách tiếp cận nhịp tim này để gọi RenewLockAsync trước khi thời hạn khóa hết hạn để thông báo không hết thời gian chờ trong khi xử lý kéo dài.
này nghe có vẻ tương tự như báo cáo tiến bộ trong một nhiệm vụ async (chỉ là điều gây ra một báo cáo là một khoảng thời gian, và không có tiến bộ thực sự để báo cáo, ngoại trừ có thể đếm nhịp tim). Một trong các liên kết này có giúp ích không? http://blogs.msdn.com/b/dotnet/archive/2012/06/06/async-in-4-5-enabling-progress-and-cancellation-in-async-apis.aspx http: // stackoverflow .com/questions/15408148/c-sharp-async-await-progress-event-on-task-object –
@TimS. Chúng tương tự nhưng không hoàn toàn là những gì tôi muốn, đặc biệt là với trường hợp không bao giờ báo cáo nếu nhiệm vụ hoàn thành một cách nhanh chóng. Ngoài ra, nhịp tim không biết tiến trình nói. Tuy nhiên, tôi rất sẵn lòng xem liệu bạn có thể triển khai phương pháp tiếp cận tiến trình để khớp với API tiện ích mở rộng của tôi và có cùng hiệu ứng thực với mã đơn giản hơn không. –