Esmu lasījis daudzus ievadrakstus par to, kā atjaunināt galveno interfeisu fona pavedienā, un lielākā daļa no tiem izmanto Control.Invoke un Control.BeginInvoke. Tie ir labi risinājumi, taču ir divas problēmas:
1. Jums ir jāatsaucas uz System.Windows.Forms un pēc tam jāizmanto System.Windows.Forms
2. Koda struktūra ir salīdzinoši nekārtīga. (Patiesībā to izraisa arī # 1)
Microsoft piedāvā vēl vienu elegantāku risinājumu, kas ir System.Threading. Sinhronizācijas konteksts。 Kā redzat, tas nav namesapce System.Windows.Forms, tāpēc mēs to varam pamatoti izmantot BusinessLaryer, Controler un pat moduļos.
Un tas ir ļoti ērti lietojams, jums jākoncentrējas tikai uz šādām divām metodēm:
1. Sūtīt: nosūta interfeisa atjaunināšanas pieprasījumu galvenajam pavedienam, bloķējot pašreizējo pavedienu, līdz tas atgriežas.
2. Post: Nosūta interfeisa atjaunināšanas pieprasījumu galvenajam pavedienam, nebloķējot pašreizējo pavedienu.
Patiesībā tie visi ir viena un tā pati metode, izņemot to, ka sūtīšana ir sinhrona un post ir asinhrona
Pirms Form1 form = new Form1() objekts SynchronizationContext bija tukšs, un, kad veidlapa Form1 tika instancēta, šim pavedienam tika pievienots objekts SynchronizationContext. Tātad atbilde ir tāda, ka, izveidojot objektu Control, tiek izveidots un pavedienam pievienots arī objekts SynchronizationContext. Viss, izmantojot veidlapu InitializeComponent(); Kad tas ir izdarīts, tas var iegūt objektu, kas nav NULL
Visbeidzot, atšķirība starp SynchronizationContext metodēm Sendt() un Post():
Send() tiek ieviests, vienkārši izsaucot pārstāvi pašreizējā pavedienā (sinhronais zvans). Tas nozīmē, ka lietotāja interfeisa pavediens tiek tieši izsaukts uz apakšpavediena, lai to izpildītu, un apakšpavediens turpinās darboties pēc lietotāja interfeisa pavediena izpildes pabeigšanas.
Post() tiek ieviests, izsaucot pārstāvi pavedienu pūlā (asinhrons izsaukums). Tas ir tāpēc, ka apakšpavediens atradīs pavedienu no pavedienu pūla, lai noregulētu lietotāja interfeisa pavedienu, un apakšpavediens tieši izpildīs savu kodu, negaidot, kamēr lietotāja interfeisa pavediens tiks pabeigts. Testa kods:
Rezultātu:
Lietotāja interfeisa galvenais pavediens: 1 Pavediens: 5 Sinhronizācijas konteksts:1
Kopsavilkuma:SynchronizeContext objekts lietotāja interfeisa pavedienā, neatkarīgi no tā, vai tas tiek izsaukts galvenajā pavedienā vai pavedienā, tiks izpildīts galvenajā pavedienā, tāpēc, ja ir daudz laikietilpīga koda, tas izraisīs lietotāja interfeisa iesaldēšanu vai viltus nāvi!
PatiesībāLietotāja interfeisa pavediens izmanto nevis klasi SynchronizationContext, bet gan WindowsFormsSynchronizationContextŠis Dongdong.
System.Threading.SynchronizationContext avota kods:
WindowsFormsSynchronizationContext avota kods:
|