2013-01-12 9 views
10

Pracuję nad aplikacją klienta WPF. Ta aplikacja okresowo przesyła dane do webservice. Kiedy użytkownik zalogował się do aplikacji, chcę uruchomić konkretną metodę co 5 mts, aby wysłać dane do usługi .asmx.Sposób wykonywania metody okresowo z aplikacji klienckiej WPF za pomocą wątkowania lub timera

Moje pytanie dotyczy tego, czy potrzebuję użyć wątku, czy timera. Wykonanie tej metody powinno się zdarzyć podczas interakcji użytkownika z aplikacją. tj. Bez blokowania interfejsu użytkownika podczas wykonywania tej metody

Wszelkie zasoby, których należy szukać?

Odpowiedz

2

Jeśli chcesz, aby metoda była wykonywana na innym wątku niż w interfejsie użytkownika, użyj System.Threading.Timer. W przeciwnym razie (ale nie sądzę, że to twój przypadek), użyj System.Windows.Threading.DispatcherTimer.

+0

OK będę pisać o tym Mainwindow.xaml.cs głównej metody. Czy ten zegar odpowiada, nawet gdy otwieram okno potomne? LUB jakie jest najlepsze miejsce na umieszczenie tego kodu, aby zaznaczyć, gdziekolwiek jestem w głównym oknie aplikacji lub w dowolnym oknie podrzędnym? –

+0

@sateeshmunagala Kontekst, w którym go umieszczasz, nie ma znaczenia, o ile możesz być pewien, że jego klasa kontenera nie jest usuwana podczas używania timera. – Mir

8

Trzeba użyć Timer klasę. Istnieje wiele wbudowanych timerów i zależy to od tego, który timer będzie używany.

  1. System.Timers.Timer: To jest bardziej odpowiedni dla mutlithreaded dostępu. Wystąpienia tego zegara są wątkami safe.

  2. System.Threading.Timer: Instancje tego timera nie są bezpieczne dla wątków.

  3. System.Windows.Threading.DispatcherTimer -> Wysyła zdarzenie do wątku Dispatcher (i nie jest wielowątkowe). Jest to przydatne, jeśli potrzebujesz zaktualizować interfejs użytkownika.

  4. System.Windows.Forms.Timer -> Ten timer podnosi zdarzenia w wątku interfejsu użytkownika. Jest to zoptymalizowane dla formularzy Windows i nie może być używane w WPF.

Oto ciekawa lektura.
Comparing the Timer Classes in the .NET Framework Class Library

+0

Dzięki za link ale mam pewne problemy ze zrozumieniem Wymagania: Klient może współdziałać płynnie z aplikacji WPF, jednoczesne wysyłanie danych do rzeczy service.Both powinno nastąpić w tym samym czasie. To jest moje pytanie, które trzeba wbudować w timer? –

+0

Są one oddzielić (interakcji klienta i wysyłania danych) lub związane razem jako części zależnych – Tilak

+0

Tak są independent.User można wstawić, aktualizacja, usuwanie danych, ale wysyłamy dane z bazy danych do usługi. –

27

Polecam nazw System.Threading.Tasks wykorzystaniem nowych async/await kluczowych.

// The `onTick` method will be called periodically unless cancelled. 
private static async Task RunPeriodicAsync(Action onTick, 
              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) 
    { 
    // Call our onTick function. 
    onTick?.Invoke(); 

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

Wtedy po prostu wywołanie tej metody gdzieś:

private void Initialize() 
{ 
    var dueTime = TimeSpan.FromSeconds(5); 
    var interval = TimeSpan.FromSeconds(5); 

    // TODO: Add a CancellationTokenSource and supply the token here instead of None. 
    RunPeriodicAsync(OnTick, dueTime, interval, CancellationToken.None); 
} 

private void OnTick() 
{ 
    // TODO: Your code here 
} 
+1

Dzięki! Bardzo podoba mi się twoje podejście! – lightxx

+0

Podobają mi się podejścia, ale jeśli utworzyć WriteableBitmap przed chwilą {} i WritePixels w czasie {} otrzymuję Threading.Dispatcher.VerifyAccess() Myślałem, że metoda/zadania był w jednym wątku? –

+0

Czy to podejście jest równoległe? –

Powiązane problemy