|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Apr 2004
Messaggi: 56
|
[C#] Control.BeginInvoke
Ciao a tutti!
Piccolo problema con un "vago" aroma di .NET in salsa win32.. Mi trovo a dover far comunicare degli UserControl custom all'interno di una applicazione WinForm in C#, abituato a MFC e Win32 (e altri 12000 sistemi pressoche'identici con le loro simpatiche code), mi aspettavo di registrare un messaggio custom e di poter mandare questo messaggio con la solita vecchia PostMessage a tutti i controlli presenti nell'applicativo....ma sembra che la cosa non sia cosi'banale ![]() Raspando su google & co mi sono imbattuto nel meraviglioso mondo della BeginInvoke...e li ho perso il filo: e possibile che uno debba sapere a priori qual'e'il controllo che ricevera'il messaggio? Non e'piu'possibile far partire un messaggio e lasciare che solo gli interessati lo considerinto? Sembra quasi che per amore di OO (object orientation) non sia piu'possibile??? Grazie a chiunque risponda! Zak |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
BeginInvoke non centra con il riuscire a fare in modo che solo qualcuno tra una collezione di controlli riceva un determinato messaggio.
Magari lo dovrai anche usare, ma non per quel motivo. Usando uno UnityInjection con magari anche un EventBus, il tuo problema diventerebbe banale. Alternativamente eleggi un oggetto ad essere possessore di un evento. Ad esempio la form/window che contiene tutto. Dota la classe anche di un metodo per invocare l'evento. Codice:
public event Action<string> Gotcha. public void GotchaFire(string str) { if (Gotcha!=null) Gotcha(str); } (questo andare a cercare e' proprio uno delle cose che la unity injection e l'EventBus ti permetterebbero di evitare) E sottoscriviti all'evento, facendogli fare qualcosa. Codice:
var formContainer = qualcosa; formContainer.Gotcha += (str) => { if (str=="EDirettoAMe") FaccioQualcosa(); } Codice:
var formContainer = qualcosa; formContainer.GotchaFire("messaggioDaMandare"); Gotcha = null;
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Apr 2004
Messaggi: 56
|
Ciao! (& grazie per la risposta!)
Infatti mi manca una sano bus/coda dove far girare i messaggi... Attualmente ho risolto utilizzando una classe di supporto...che fa praticamente da bus ![]() Ho adesso un singleton (la classe di supporto) su cui i vari UserControls si registrano con il loro bel delegate da eseguire stile Codice PHP:
E a questo punto per invocare il tutto faccio qualcosa del genere Codice PHP:
Codice PHP:
Zak PS rivoglio i messaggi disaccoppiati uffaaaaaaa ![]() |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Ogni tipo di evento e' una classe a se' stante, e il codice usante compiera' cose del genere: Bus.RaiseEvent<ColoraDiRosso>(); Bus.RaiseEvent<SalveLePreferenze>(); E il codice intercettante qualcosa come Bus.Subscribe<ColoraDiRosso>( MetodoCheVaAColorareDiRosso); Bus.Subscribe<SalveLePreference>( MetodoCheSalveLePreference ); Cerca in giro, se non addirittura usa direttamente, EventBus Comunque il problema della BeginInvoke non centra nulla con questo pattern. La BeginInvoke e' semplicemente necessaria, sotto Winform, quando occorre agire su una finestra/controllo della GUI a partire da Thread che non sono il Thread della finestra. E ci sono anche metodi per evitarlo ed avere quindi codice piu' pulito. Cerca in giro MVP o MVVM.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
|
mai usato MVVM in contesto winforms, é supportato bene?
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
MVVM sotto WPF
Sotto Winform MVP o MVC
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: May 2009
Messaggi: 274
|
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:04.