2012-11-24 18 views
6

Ho un piccolo problema con la mia applicazione.
Vorrei aggiornare qualcosa sull'interfaccia utente ogni 10 secondi. Per prima cosa ho usato uno DispatcherTimer ma questo bloccherà la mia interfaccia utente per un breve periodo perché il metodo di aggiornamento deve caricare qualcosa dal web e questa operazione richiede del tempo. Ora ho pensato a qualche tipo di background worker e ho trovato i BackgroundTasks.
Il problema con le attività in background è, per quanto ho capito correttamente, che dovrebbero funzionare come updaters anche se l'app è sospesa. Non ne ho bisogno. Mi piacerebbe solo aggiornare se la mia app è in esecuzione non se è sospesa.Timer di sfondo per aggiornare l'interfaccia utente?

C'è un buon modo per risolvere questo? Qualche suggerimento cosa usare per questo?

Grazie in anticipo!

+0

Non credo che ci sia qualcosa di sbagliato con l'utilizzo di un lavoratore di fondo per questo. Non dovrebbe causare problemi, ma se non vuoi usarne uno, puoi usare il threading, che è fondamentalmente ciò che fa l'operatore in background con alcune aggiunte. Controlla la mia risposta per informazioni su come farlo. – FrostyFire

+0

per i principianti, che cosa hai provato? Puoi accendere un filo e danzare con esso. Vedere: 1. http://msdn.microsoft.com/en-us/library/aa645740%28v=vs.71%29.aspx 2. http://msdn.microsoft.com/en-us/library/ms173178 % 28v = vs80% 29.aspx 3. https://www.google.ca/#hl=en&sugexp=les%3B&gs_nf=3&tok=BSvnKvGpLPeMsccfqVbvVQ&cp=9&gs_id=bz&xhr=t&q=thread+c%23&pf=p&tbo=d&sclient = psy-ab e oq = thread + c% 23 & gs_l = & pbx = 1 & bav = on.2, o.r_gc.r_pw.r_cp.r_qf. & fp = d74e08ea70650bbd & bpcl = 38897761 & biw = 1280 & bih = 892 4. http://msdn.microsoft.com/ it-us/library/system.threading.thread.aspx 5. http://msdn.microsoft.com/en-us/library/ms173178. –

risposta

11

Hai bisogno di due cose per esso:

  1. Timer

    È possibile aggiornare l'interfaccia utente in System.Timers.Timer con l'intervallo di 10 secondi.

  2. Dispatcher

    È necessario utilizzare Dispatcher.Invoke per modificare l'interfaccia utente senza tenere il filo utente principale. Invece il metodo Process dovrebbe essere chiamato un thread separato (Timer metodo), diversi principale thread UI e utilizzarlo Dispatcher in modo da avvisare thread UI principale per il cambiamento.

    Process() // method to be called after regular interval in Timer 
    { 
        // lengthy process, i.e. data fetching and processing etc. 
    
        // here comes the UI update part 
        Dispatcher.Invoke((Action)delegate() { /* update UI */ }); 
    } 
    
+0

System.Timers.Timer non può essere utilizzato per aggiornare l'interfaccia utente. L'hai provato?questo è ciò che hanno scritto in MSDN ma non l'ho ancora provato: se si utilizza la classe System.Timers.Timer con un elemento dell'interfaccia utente, ad esempio un modulo o un controllo, senza posizionare il timer su quell'elemento dell'interfaccia utente, assegnare il modulo o controllo che contiene il timer alla proprietà SynchronizingObject, in modo che l'evento venga eseguito il marshalling sul thread dell'interfaccia utente. https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx –

+0

Ho provato e ha funzionato devi aggiungere la seguente riga di codice per assegnare il modulo come oggetto di sincronizzazione t.SynchronizingObject = (this); –

0

Inoltre, è possibile avviare un timer, che ha un evento trascorso, che si verifica ogni volta che il timer supera un determinato ciclo di tempo.

  1. http://www.dotnetperls.com/timer
2

È necessario creare un filo che corre la parte del codice che ottiene ed elabora le informazioni dal sito web. In questo modo, il tuo modulo non esiterà perché sarà su un thread diverso rispetto alla parte di elaborazione.

This L'articolo sul progetto di codice dovrebbe iniziare.

Problemi correlati