2013-03-18 6 views
5

Znalazłem świetny sposób, jak to zrobić za pomocą okresowej pracy asynchronicznej/wzór czekają tu: https://stackoverflow.com/a/14297203/899260Utwórz metodę rozszerzenia zrobić okresowych pracom

co teraz chciałbym zrobić, to utworzyć metodę rozszerzenia tak, abym mógł zrobić Czy to w ogóle możliwe i czy, jak by to zrobić?

EDIT:

Dotychczas I refactored kod z URL powyższe pod metodę rozszerzenia, ale nie wiem jak postępować stamtąd

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

Czy wiesz, jak utworzyć metodę rozszerzenia? Jeśli tak, masz odpowiedź, jeśli nie, możesz skorzystać z Google. –

+0

@MarcinJuraszek Odinstalowałem kod z linku do metody rozszerzenia, ale nie wiem, jak przejść dalej. Zobacz moją edycję. – lightxx

+0

Pokaż swój kod, a następnie – MarcinJuraszek

Odpowiedz

4

Czy „okresowe działa "kod dostępu do dowolnego z publicznych członków someInstruction? Jeśli nie, to nie ma większego sensu używanie metody rozszerzającej w pierwszej kolejności.

jeśli to robi, i zakładając, że someInstruction jest instancją SomeClass, można zrobić coś jak następuje:

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

Oczywiście należy zdać someInstruction do konstruktora Task jako parametr (tam jest Przeciążenie konstruktora, które pozwala to zrobić).

UPDATE oparte na komentarz przez OP:

Jeśli chcesz po prostu mieć wielokrotnego użytku sposób wykonywania dowolnego kodu okresowo, wówczas metoda rozszerzenie nie jest to, czego potrzebujesz, ale dość proste klasy narzędzie. Adaptacja kod z linku, który podałeś, to byłoby coś takiego:

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);  
    } 
} 
} 

Potem go używać tak:

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

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

lub z prostym lambda wyrażenia:

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

hm. moja intencja była taka: używam tego kodu w całym miejscu, a zmienia się tylko wiersz z komentarzem "// TODO: Wykonaj jakąś pracę tutaj". Pomyślałem więc, że zamiast kopiować i wklejać ten kod w całym miejscu, chciałbym mieć jakiś standardowy kod i po prostu przekazać instrukcje. Stąd pomysł z metodą rozszerzenia. – lightxx

+1

W takim przypadku zobacz zaktualizowaną odpowiedź. – Konamiman

+0

dzięki! btw "public static Task DoPeriodicWorkAsync" powinno być "public static async Task DoPeriodicWorkAsync";) – lightxx