-1

Я хочу запустить длительный процесс в службе windows асинхронно - и опросить процесс каждые 3 секунды и сообщить об этом с помощью SignalR. Нижеприведенный код (теоретически) сделает это на основе событий, но я не хочу увольнять прогресс с каждым изменением..NET 4.5 Пример выполнения опроса Пожалуйста,

Может ли кто-нибудь предоставить простой пример того, как реализовать это специально, чтобы начать процесс и выполнить опрос/отчет. Пожалуйста, имейте в виду, что я не работал полностью на протяжении нескольких лет!

public async Task<string> StartTask(int delay) 
{ 
    var tokenSource = new CancellationTokenSource(); 
    var progress = new Progress<Tuple<Int32, Int32>>(); 

    progress.ProgressChanged += (s, e) => 
    { 
     r2hProcessesProxy.Invoke("DownloadNotify", string.Format("Major={0} - Minor={1}", e.Item1 , e.Item2 )); 
    }; 

    var task = DownloadTask.DoDownload(delay, tokenSource.Token, new Progress<Tuple<Int32,Int32>>(p => new Tuple<Int32, Int32>(0,0))); 

    await task; 

    return "Task result"; 
} 
+0

SignalR имеет встроенную поддержку для '' IProgress если это проще ... –

+0

К сожалению - да она использует signalR, но я хотите опросить асинхронный процесс, а не нажимать каждый раз отчет о ходе работы с объекта задачи async. –

+0

Я просто не уверен, как реализовать опрос на этой странице https://msdn.microsoft.com/en-us/library/hh873177(v=vs.110).aspx –

ответ

0

Вы можете сделать это с использованием реактивных расширений (Rx). Проверьте Throttle() метод: https://msdn.microsoft.com/en-us/library/hh229400(v=vs.103).aspx

using System; 
using System.Linq; 
using System.Reactive.Linq; 
using System.Threading.Tasks; 

public class Test 
{ 
    public async Task<string> StartTask(int delay) 
    { 
     var tokenSource = new CancellationTokenSource(); 
     var progress = new Progress<Tuple<Int32, Int32>>(); 

     var observable = Observable.FromEvent<EventHandler<Tuple<Int32, Int32>>, Tuple<Int32, Int32>>(h => progress.ProgressChanged += h, h => progress.ProgressChanged -= h); 
     var throttled = observable.Throttle(TimeSpan.FromSeconds(3)); 

     using (throttled.Subscribe(e => 
     { 
      r2hProcessesProxy.Invoke("DownloadNotify", string.Format("Major={0} - Minor={1}", e.Item1, e.Item2)); 
     })) 
     { 
      await DownloadTask.DoDownload(delay, tokenSource.Token, new Progress<Tuple<Int32, Int32>>(p => new Tuple<Int32, Int32>(0, 0))); 
     } 

     return "result"; 
    } 
} 

Проверить http://go.microsoft.com/fwlink/?LinkId=208528 для получения дополнительной информации о RX

+0

Thx - У меня будет игра с it - но e не является объектом в подписке using statement (ieeItem1 недействителен) –

+0

Что вы имеете в виду? Проверьте использование операторов, потому что Subscribe - это метод расширения из Rx. –

+0

О да, извините слишком много поздних ночей. –