Thứ Năm, 18 tháng 5, 2023

Thực thi tác vụ trong một khoảng thời gian quy định

Để thực hiện một hàm trong một khoảng thời gian quy định và ngừng nếu quá thời gian, bạn có thể sử dụng đối tượng CancellationTokenSource và Task trong C#. Dưới đây là một ví dụ minh họa:

csharp
using System; using System.Threading; using System.Threading.Tasks; public class Program { public static void Main() { CancellationTokenSource cts = new CancellationTokenSource(); TimeSpan duration = TimeSpan.FromHours(3); // Bắt đầu thực hiện hàm A trong 3 giờ Task task = Task.Run(() => FunctionA(cts.Token), cts.Token); // Chờ trong 3 giờ bool completed = task.Wait(duration); // Kiểm tra xem hàm đã hoàn thành hay chưa if (completed) { Console.WriteLine("Hàm A đã hoàn thành trong thời gian quy định."); } else { // Nếu hàm chưa hoàn thành, hủy tác vụ và thông báo hết giờ cts.Cancel(); Console.WriteLine("Hết giờ quy định, hàm A đã bị dừng."); } } public static void FunctionA(CancellationToken cancellationToken) { // Ví dụ: Thực hiện một công việc lặp đi lặp lại trong hàm A while (!cancellationToken.IsCancellationRequested) { // Thực hiện công việc Console.WriteLine("Đang thực hiện công việc A..."); // Ngừng một khoảng thời gian trước khi tiếp tục Task.Delay(TimeSpan.FromSeconds(1)).Wait(); } } }

Trong ví dụ trên, chúng ta sử dụng CancellationTokenSource để tạo ra một CancellationToken để có thể hủy bỏ thực thi của hàm A. Task.Run được sử dụng để chạy hàm A trong một luồng riêng biệt. Bằng cách sử dụng Task.Wait, chúng ta chờ đợi trong một khoảng thời gian quy định (3 giờ). Nếu hàm A hoàn thành trong thời gian quy định, chúng ta sẽ nhận được thông báo "Hàm A đã hoàn thành trong thời gian quy định". Nếu hàm A không hoàn thành trong thời gian quy định, chúng ta sẽ hủy bỏ tác vụ và nhận được thông báo "Hết giờ quy định, hàm A đã bị dừng".


Lưu ý rằng trong hàm A, chúng ta cần kiểm tra cancellationToken.IsCancellationRequested để kiểm tra xem có yêu cầu hủy bỏ thực thi hay không. Trường hợp này cho phép chúng ta thoát khỏi vòng lặp và dừng thực hiện công việc.



Không có nhận xét nào: