Problema aggiornamento asincrono Finestra WPF

lunedì 09 gennaio 2012 - 14.31
Tag Elenco Tags  C#  |  .NET 2.0  |  .NET 3.0  |  .NET 3.5  |  .NET 4.0  |  Visual Studio 2010

eomer75 Profilo | Newbie

Se in una finestra WPF voglio che un controllo sia aggiornato da un altro thread come devo fare?

Ho provato così: Dovrebbe essere che il testo del textblock si aggiorna ogni decimo di secondo aggiungendo un nuovo carattere, invece lo vedo solo quando il testo è completo, come se il thread secondario bloccasse il thread principale.

public MainControl() { InitializeComponent(); ThreadStart start = delegate() { // ... DispatcherOperation op = Dispatcher.BeginInvoke( DispatcherPriority.Send, new Action(SetMainText)); DispatcherOperationStatus status = op.Status; while (status != DispatcherOperationStatus.Completed) { status = op.Wait(TimeSpan.FromMilliseconds(100)); if (status == DispatcherOperationStatus.Aborted) { ; } } }; Thread t = new Thread(start); t.SetApartmentState(ApartmentState.STA); t.Start(); } private void SetMainText() { string MainText = "Trasmissione dati integrata"; //txtMain.Text = MainText; txtMain.Text = string.Empty; foreach (char c in MainText) { txtMain.Text += c; System.Threading.Thread.Sleep(100); } }

luigidibiasi Profilo | Guru

Credo sia sbagliata l'intera impostazione...

i thread devono viaggiare in modo totalmente sconnesso.. posto un esempio che sicuramente va' ottimizzato ma non conosco bene c# e quindi mi sono adattato un po'.

In pratica il thread secondario deve chiedere al thread principale di aggiornare la textbox poiché la textbox è di sua proprietà (il problema del cross threading) e questo lo puoi fare semplicemente con i delegati

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Reflection; namespace WpfApplication1 { /// <summary> /// Interaction logic for Window1.xaml /// </summary> public partial class Window1 : Window { System.Threading.Thread tx; public delegate void updateText(); updateText d; public Window1() { InitializeComponent(); d = new updateText(Updatex); t1.Text = ""; tx = new System.Threading.Thread(FillTextbox); tx.Start(); } int curChar=0; string toWrite = "test parse deeeeee12345 -"; public void Updatex() { t1.Text = t1.Text + toWrite[curChar]; } private void FillTextbox() { while (curChar != toWrite.Length) { Dispatcher.Invoke(d, null); System.Threading.Thread.Sleep(100); curChar++; } } } }
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5