2013-03-18 3 views
5

Я нашел отличный способ, как сделать периодическую работу с использованием асинхронного/ОЖИДАНИЕ рисунка здесь: https://stackoverflow.com/a/14297203/899260Создать метод расширения, чтобы сделать периодическую РАБОТУ

Теперь то, что я хотел бы сделать, это создать метод расширения так что я могу сделать

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

Возможно ли это вообще, и если, как бы вы это сделали?

EDIT:

До сих пор я переработан код из URL выше в метод расширения, но я не знаю, как поступить оттуда

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

Вы знаете, как создать метод расширения? Если да, у вас есть ответ, если нет, вы можете использовать Google. –

+0

@MarcinJuraszek Я переработал код из ссылки в метод расширения, но я не знаю, как исходить оттуда. См. Мое редактирование. – lightxx

+0

Показать код – MarcinJuraszek

ответ

4

ли «периодический работать ", обращаясь к любому из публичных членов someInstruction? Если нет, то не имеет смысла использовать метод расширения в первую очередь.

если он делает, и предполагая, что someInstruction является экземпляром SomeClass, вы могли бы сделать что-то вроде следующего:

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

Конечно, вы должны пройти someInstruction к Task конструктору в качестве параметра (есть перегрузка конструктора, которая позволяет это сделать).

UPDATE на основе комментариев по OP:

Если вы просто хотите иметь многоразовый способ выполнения произвольного кода периодически, то метод расширения не то, что вам нужно, а простая утилита класса. Адаптация кода по ссылке вы предоставили, было бы что-то вроде этого:

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

Тогда вы использовать его как это:

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

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

или с помощью простого лямбда-выражения:

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

hm. мое намерение было таким: я повторно использую этот код повсюду, и только строка с комментарием «// TODO: сделайте какую-то работу здесь». Поэтому я подумал, что вместо копирования и вставки этого кода повсюду, я хотел бы иметь некоторый шаблонный код и просто передать инструкции. Отсюда и идея с методом расширения. – lightxx

+1

В этом случае см. Обновленный ответ. – Konamiman

+0

спасибо !! btw "public static Task DoPeriodicWorkAsync" должен быть "public static async Task DoPeriodicWorkAsync";) – lightxx

Смежные вопросы