Hejsa. Jeg har et problem med en Windows.Form der fryser, når jeg afvikler en metode som blokker i et stykke tid inden den returnerer.
Derfor valgte jeg at lade metoden køre i en tråd for sig:
public void MakePayment(double anAmount) { // Konvertere kroner til øre amount = (int)anAmount * 100;
GfxGUI gui = new GfxGUI(); gui.Visible = true;
Thread thread = new Thread(new ThreadStart(DoPayment)); thread.Start();
lock (this) { Monitor.Wait(this);} }
private void DoPayment() { result = kald_til_ekstern_metode_der_blokker();
lock (this) { Monitor.Pulse(this);} }
MakePayment må IKKE returnere før tråden er færdig - og jeg har derfor forsøgt mig med Wait/Pulse. Desværre ser det ud til at kaldet til Wait får GUI'en til at fryse. Jeg har derfor forsøgt også at køre GUI'en i en tråd for sig, men den fryser stadig - eller også ved jeg bare ikke hvordan man gør det rigtigt!
Er der ikke to issues her? For det første hvis et winforms programs hovedtråd arbejder, bliver GUI'en ikke opdateret (det er jo hovedtråden der står for opdateringen/messagepump).
For det andet, koden øverst låser vel pga af de to locks. Typisk sker der vel: * hovedtråden tager låsen og venter på Pulse-kaldet. * DoPayments tråd bliver færdig med kald til blokerende metode. * DoPayments tråd prøver at tage låsen. Dvs den står og venter til låsen frigives. * Låsen frigives først når Pulse-kaldet gennemføres. Så det er en klassisk deadlock situation.
(Teoretisk kunne der også ske det, at lige efter den nye tråd er startet op, skiftes hovedtråden af processoren og den kommer ikke tilbage på processoren før den nye tråd er helt færdig, så deadlock'en er ikke logisk. Omend den sikkert opleves 'konsistent'.)
Hvorfor skal MakePayment metoden venter på at arbejdet i DoPayment metoden er færdigt? Måske kunne du i stedet disable kontroller eller tilsvarende hvis brugeren ikke må (kunne) foretage sig noget før DoPayment er færdig.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.