2013-03-18 13 views
5

Tôi tìm thấy một cách tuyệt vời về cách để làm công việc định kỳ bằng cách sử dụng async/chờ đợi mẫu ở đây: https://stackoverflow.com/a/14297203/899260Tạo một phương pháp mở rộng để làm việc định kỳ

Bây giờ những gì tôi muốn làm là tạo ra một phương pháp khuyến nông để tôi có thể làm

someInstruction.DoPeriodic(TimeSpan.FromSeconds(5)); 

Điều đó có thể xảy ra và nếu, bạn sẽ làm như thế nào?

EDIT:

Cho đến nay, tôi refactored mã từ URL trên vào một phương pháp mở rộng, nhưng tôi không biết làm thế nào để tiến hành từ đó

public static class ExtensionMethods { 
    public static async Task<T> DoPeriodic<T>(this Task<T> task, CancellationToken token, TimeSpan dueTime, TimeSpan interval) { 
     // Initial wait time before we begin the periodic loop. 
     if (dueTime > TimeSpan.Zero) 
      await Task.Delay(dueTime, token); 

     // Repeat this loop until cancelled. 
     while (!token.IsCancellationRequested) { 


      // Wait to repeat again. 
      if (interval > TimeSpan.Zero) 
       await Task.Delay(interval, token); 
     } 
    } 
} 
+0

Bạn có biết cách tạo phương thức mở rộng không? Nếu có, bạn có câu trả lời, nếu không, bạn có thể sử dụng Google. –

+0

@MarcinJuraszek Tôi đã refactored mã từ liên kết vào một phương pháp mở rộng, nhưng tôi không biết làm thế nào để tiến hành từ đó. Xem chỉnh sửa của tôi. – lightxx

+0

Hiển thị mã của bạn sau đó – MarcinJuraszek

Trả lời

4

Là "định kỳ làm việc "mã truy cập vào bất kỳ thành viên nào trong số someInstruction công khai? Nếu không, nó không có ý nghĩa nhiều để sử dụng một phương pháp mở rộng ở nơi đầu tiên.

nếu có, và giả định rằng someInstruction là một thể hiện của SomeClass, bạn có thể làm một cái gì đó như sau:

public static class SomeClassExtensions 
{ 
    public static async Task DoPeriodicWorkAsync(
             this SomeClass someInstruction, 
             TimeSpan dueTime, 
             TimeSpan interval, 
             CancellationToken token) 
    { 
     //Create and return the task here 
    } 
} 

Tất nhiên bạn phải vượt qua someInstruction để các nhà xây dựng Task như một tham số (có một quá tải constructor cho phép bạn làm điều đó).

CẬP NHẬT dựa trên nhận xét của OP:

Nếu bạn chỉ muốn có một phương pháp tái sử dụng cho thực thi mã tùy ý theo định kỳ, sau đó là một phương pháp khuyến nông không phải là những gì bạn cần, mà đúng hơn là một lớp tiện ích đơn giản. Thích ứng với mã từ liên kết mà bạn cung cấp, nó sẽ là một cái gì đó như thế này:

public static class PeriodicRunner 
{ 
public static async Task DoPeriodicWorkAsync(
           Action workToPerform, 
           TimeSpan dueTime, 
           TimeSpan interval, 
           CancellationToken token) 
{ 
    // Initial wait time before we begin the periodic loop. 
    if(dueTime > TimeSpan.Zero) 
    await Task.Delay(dueTime, token); 

    // Repeat this loop until cancelled. 
    while(!token.IsCancellationRequested) 
    { 
    workToPerform(); 

    // Wait to repeat again. 
    if(interval > TimeSpan.Zero) 
     await Task.Delay(interval, token);  
    } 
} 
} 

Sau đó, bạn sử dụng nó như thế này:

PeriodicRunner.DoPeriodicWorkAsync(MethodToRun, dueTime, interval, token); 

void MethodToRun() 
{ 
    //Code to run goes here 
} 

hoặc với một biểu thức lambda đơn giản:

PeriodicRunner.DoPeriodicWorkAsync(() => { /*Put the code to run here */}, 
    dueTime, interval, token); 
+0

hm. ý định của tôi là như thế này: Tôi đang sử dụng lại mã đó khắp nơi, và chỉ có dòng với chú thích "// TODO: Làm một số công việc ở đây." thay đổi. Vì vậy, tôi nghĩ thay vì sao chép và dán mã đó trên khắp nơi, tôi muốn có một số mã boilerplate và chỉ cần vượt qua trong các hướng dẫn. Do đó ý tưởng với phương pháp mở rộng. – lightxx

+1

Trong trường hợp đó, hãy xem câu trả lời được cập nhật. – Konamiman

+0

thanks !! btw "Tác vụ tĩnh công cộng DoPeriodicWorkAsync" phải là "công khai đồng bộ tĩnh Công việc DoPeriodicWorkAsync";) – lightxx

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