» »

[c#] Vprasanje glede BackGroundWorker classa in spreminanja gui elementa

[c#] Vprasanje glede BackGroundWorker classa in spreminanja gui elementa

KernelPanic ::

Spostovani!

Imam aplikacijo, ki preko BackgroundWorker objekta bere status naprave. To je vse ok, vendar moram sedaj glede na stanje nekega bita sprementi besedilo objekta Label v GUI. Ko probam nastaviti tekst, mi javi sledece (ko program deluje), mi javi sledece:
System.InvalidOperationException was unhandled by user code
Message=Cross-thread operation not valid: Control 'm_tbLastTransaction' accessed from a thread other than the thread it was created on.
Source=System.Windows.Forms
StackTrace:
at System.Windows.Forms.Control.get_Handle()
at System.Windows.Forms.Control.set_WindowText(String value)
at System.Windows.Forms.TextBoxBase.set_WindowText(String value)
at System.Windows.Forms.Control.set_Text(String value)
at System.Windows.Forms.TextBoxBase.set_Text(String value)
at System.Windows.Forms.TextBox.set_Text(String value)
at AccuLoadIIIMonitor.FormMain.checkTransactionIdetificationNumbers() in D:\Projects\AccuLoadIIISolution\AccuLoadIIIMonitor\FormMain.cs:line 1342
at AccuLoadIIIMonitor.FormMain.m_bwProcessAccuLoadIII_DoWork(Object sender, DoWorkEventArgs e) in D:\Projects\AccuLoadIIISolution\AccuLoadIIIMonitor\FormMain.cs:line 1679
at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)
InnerException:
Kako iz BackgroundWork objekta spremenis gui element v klicajocem GUI glavnem threadu?

Ericssony ::

Z metodo Invoke na objektu.
Z uporabo "Lambda Expression" narediš to preprosto tako:
ImeObjekta.Invoke((Action)(() => ImeObjekta.Lastnost = novaVrednost));

Drug način pa je z uporabo "delegat-a":
this.Invoke(new MethodInvoker(ImeMetode));

Znotraj ImeMetode pa narediš to kar pač moraš.

urbecar ::

Ali a izsek iz MSDN: To set up for a background operation, add an event handler for the DoWork event. Call your time-consuming operation in this event handler. To start the operation, call RunWorkerAsync. To receive notifications of progress updates, handle the ProgressChanged event. To receive a notification when the operation is completed, handle the RunWorkerCompleted event.

Ericssony ::

Ravno iz DoWork event handlerja ne mores dostopati do glavne niti zato moras uporabiti zgoraj omenjen nacin...

nightrage ::

Zadevo lahko verjetno rešiš na več načinov jaz vem za dva
1. s pomočjo delegatov
2. s pomočjo ProgressChanged metode, ki jo ima background worker za updatati stanja na gui-ju.

KernelPanic ::

Ok, samo kdaj se ta ProcessChanged event prozi, jaz imam neskoncno zanko v threadu, ker mora iz naprave nonstop brati stanje, da nato v GUI threadu prikazujem stanja (v obliki semaforja - zeleno HIGH, rdece LOW)

Ericssony ::

ProgressChanged event prožiš sam v eventu DoWork z metodo ReportProgress(i). Še prej pa moraš nastaviti lastnost WorkerReportsProgress...
Glede na to, da imaš v eventu DoWork neskoncno zanko ti ne preostane drugo kot Invoke na objektu.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[c#] Vprasanje glede eventov

Oddelek: Programiranje
101408 (1122) Looooooka
»

[c#] Vprašanje glede release verzije aplikacije

Oddelek: Programiranje
51501 (1325) Ericssony
»

Tezava pri instanciranju class-a

Oddelek: Programiranje
61303 (1174) KernelPanic
»

C# BackgroundWorker Class problem

Oddelek: Programiranje
61266 (1222) hendriks
»

null reference exception na čudnem mestu C#

Oddelek: Programiranje
51312 (1249) krho

Več podobnih tem