Go Down

Topic: Strano problema backgroundworker C# (Read 665 times) previous topic - next topic

Nik_90

Ciao.. spero di non andare molto OT ma da questo dipende molto il funzionamento di arduino xD

Veniamo al dunque, ho una combobox che viene popolata con una lista di indirizzi ip all'inizio dell'esecuzione del programma, quindi nel public MainForm()..
All'avvio del programma tutto funziona regolarmente.. la combobox viene popolata correttamente..
Tramite la pressione di un tasto sul software si passa ad un backgroundworker che deve prendersi dei paramentri inseriti nel form principale! Quindi nel mio caso.. un nome utente, la password e l'indirizzo IP
Nome utente e password sono delle textbox mentre gli indirizzi IP come detto prima stanno in una combobox!
Il problema sta proprio nella lettura della combobox! Nome utente e password infatti vengono letti tranquillamente (ho fatto in questo modo):

Code: [Select]

string usr = username_text.Text;
string psw = password_text.Text;


gli indirizzi ip invece no! (ho provato a fare in questo modo):

Code: [Select]

string ip = comboBox3.SelectedItem.ToString();


Il programma parte senza darmi nessun errore.. ma è come se ignorasse (o non vedesse) la presenza di quella combobox!

Per farvi capire il comportamento ho fatto una prova del genere:


Code: [Select]

string ip = ("192.168.1.1");
MessageBox.Show(ip);


In questo modo il messagebox mi esce.

facendo invece così:

Code: [Select]

string ip = comboBox3.SelectedItem.ToString();
MessageBox.Show(ip);


il messagebox non esce!

Qualcuno può aiutarmi?!

Grazie mille in anticipo a tutti!!


francesco84

Ciao il select item ti da la cella, devi utilizzare il .value

Nik_90


Ciao il select item ti da la cella, devi utilizzare il .value


Appena provato niente da fare.. la msgbox non esce... ho provato così è come dici tu?
Code: [Select]

string ip = comboBox3.SelectedValue.ToString();
MessageBox.Show(ip);



flz47655

Ciao, se alleghi il programma provo a darci un'occhiata

BrainBooster

non conosco  quel linguaggio ma prova a vedere se esiste comboBox3.SelectedItem.Text();

francesco84

string item =   combobox1.Selection.Value.ToString()

Nik_90


string item =   combobox1.Selection.Value.ToString()



Selection non esiste.. non me lo da.. forse intendevi:

Code: [Select]

string ip = comboBox3.SelectedItem.ToString();


oppure

Code: [Select]

string ip =   comboBox3.SelectedValue.ToString();


che ho già provato ma niente da fare.. Non vengono rilevati.. il fatto è proprio come se si bloccase l'esecuzione del codice.. il programma non va in crash ma non fa più nulla..

flz47655

Ho visto il tuo codice e ci sarebbero tante cose da dire, per il momento ti aiuto a capire e risolvere il tuo problema.

Un pò di nozioni:
Il backgroundworker esegue il codice su un altro thread
Da un altro thread non puoi accedere a controllo creati sul thread principale, altrimenti ottieni un eccezione
Eccezioni su thread secondari in background sono silenti, il thread termina ma non viene mostrato nessun errore

Quello che succede è che l'applicazione va in errore e non viene eseguita l'istruzione del secondo messagebox
Per accedere in modo sicuro al controllo da un thread secondario devi "chiedere" al thread principale di eseguire una funzione, puoi farlo tramite il metodo invoke


      string ip = "";
      comboBox3.Invoke(new Action(() => { ip = comboBox3.Text; }));
      MessageBox.Show(ip);

Ho usato la proprietà text sulla combobox nell'esempio perchè non aggiungi gli ip alla collezione items della combobox e recupero quindi semplicemente il testo scritto dall'utente.

Ciao

francesco84

in realtà andrebbero utilizzati gli eventi e i delagati
ad esempio

If Me.InvokeRequired Then
                Me.Invoke(New LockMenuDelegate(AddressOf AbilitaControlli), value)

            Else
bla bla bla

flz47655

Nel codice che ho proposto vengono utilizzate le espressioni lambda per fare la stessa cosa, si ottiene una leggibilità migliore di quella proposta da francesco84.

InvokeRequired è superfluo, è sicuramente richiesto l'Invoke in quanto siamo su un altro thread.

Comunque un utilizzo più semplice del backgroundWorker fa uso degli eventi RunWorkerCompleted e ProgressChanged che vengono scatenati sul thread principale.

Ciao

francesco84

#10
Mar 05, 2012, 01:11 pm Last Edit: Mar 05, 2012, 01:13 pm by francesco84 Reason: 1
invokerequired nn è obblogatorio, è un controllo consigliato
http://msdn.microsoft.com/en-us/library/ms171728.aspx

http://msdn.microsoft.com/it-it/library/system.componentmodel.isynchronizeinvoke.invokerequired.aspx

Go Up