C# Programba új ablakot nyitok, az új szálon fog futni?
Az érdekelne, hogyha megnyitok C#-ban egy új ablakot az adott
programon belül, azt a C# illetve a futtatókörnyezet automatikusan új
szálon nyitja meg vagy ugyanazon a szálon fog futni mint a főablak?
Az attól függ, hogyan nyitsz új ablakot.
Ha a főablak valamelyik eseménykezelőjében csinálsz egy másik Form példányt, és azt mondod neki, hogy Show, vagy ShowDialog, akkor az ugyanazon a szálon fog futni, mint a főablak, mivel a főablak eseménykezelőjében hoztad létre, az eseménykezelő függvények pedig a főablak szálán futnak(inkább jobb megfogalmazás lenne az, hogy az alkalmazás fő szálán, amiben a message loop van).
Magyarul ezek az ablakok egy szálon osztoznak.
A Show és a ShowDialog között a különbség az, hogy a Show nem blokkolja a hívó szálat, és nem tiltja le a többi formot, így a fő szál message loop-ja tovább tud futni.
De természetesen a fő szál message loop-ja fogja kezelni az összes ablakhoz érkező üzeneteket, így nem tud két különböző formon két eseménykezelő parallel módon futni.
A ShowDialog ezzel szemben blokkolja a hívó szálat, letiltja a többi formot, emiatt viszont szüksége van egy saját message loop-ra(mivel az eredetit ugye blokkolta), hogy fel tudja dolgozni az üzeneteket(gyakorlatilag átveszi arra az időre az eredeti message loop szerepét, amíg be nem záródik, ezért is van az, hogy hiába van letiltva a főform, a paint eseménye pl. ugyanúgy lefut, mint addig).
Mindez persze nem jelenti azt, hogy nem lehet olyan alkalmazást csinálni, ami több UI szálat is futtat(több szál, mindegyik saját message loop-al), a lényeg az, hogy az új szálon ShowDialog-gal kell kirakni a Formot, mert Show esetén nem lesz message loop, és rögtön be is záródik, a futtató szál pedig véget ér.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!