Vra

Ek het onlangs probeer om te gebruik backgroundworker in plaas van "klassieke" drade en ek besef dat dit is wat veroorsaak dat, ten minste vir my, meer probleme as oplossings.Ek het'n backgroundworker die bestuur van'n sinchroniese lees (in hierdie geval van serialPort) en om geblokkeer sowat 30 sekondes in 1 kode lyn, dan cancellationpending is nie die oplossing nie.Ek sien dat indien die aansoek kry gesluit op hierdie punt (óf met die kruis knoppie en die Aansoek.Uitgang()) die proses hou zombie vir ewig.

Ek nodig het om'n manier te dwing aborteer of dood te maak die backgroundworker draad.

Was dit nuttig?

Oplossing

Ek is nie baie seker oor wat jy probeer om te bereik, maar miskien die SerialPort.DataReceived geleentheid is'n beter oplossing?

As jy reeds vaardig met die gebruik van drade, ek sien nie die punt in die gebruik van BackgroundWorker.Dit is ontwerp vir mense wat nie verstaan drade in die eerste plek.

Buitendien, ek hou nie van die idee van die staak'n draad.Dit voel gevaarlik, en gewilde programme hoef nie enige meer risiko te neem.

Ander wenke

Ek sit een saam dat (ek dink) doen die werk. Laat weet my asseblief indien im waaaay af. Hier is 'n eenvoudige exaple van hoe dit werk.

var backgroundWorker = new BackgroundWorker(){WorkerSupportsCancellation = true};

backgroundWorker.DoWork += (sender, args) =>
         {                 
                 var thisWorker = sender as BackgroundWorker;
                 var _child = new Thread(() =>
                                               {
                                                   //..Do Some Code

                                               });
                 _child .Start();
                 while (_child.IsAlive)
                 {
                     if (thisWorker.CancellationPending)
                     {
                         _child.Abort();
                         args.Cancel = true;
                     }
                     Thread.SpinWait(1);
                 }                 
         };

 backgroundWorker.RunWorkerAsync(parameter);
 //..Do Something...
backgroundWorker.CancelAsync();

Sedert die agtergrond werker is deel van die draad swembad, dont ons wil dit staak. Maar ons kan 'n draad intern wat ons kan nie toelaat dat 'n Staak om op voorkom hardloop. Die Background dan basies loop totdat óf die kind draad is voltooi of ons sein om dit na die proses dood te maak. Die agtergrond werker draad kan dan gaan terug na die lees swembad. Tipies sal ek dit draai in 'n helper klas en gaan deur die afgevaardigde metode wat ek wil die agtergrond draad te hardloop geslaag in die parameter en hardloop dat in die kind draad.

Let asseblief iemand laat weet my as im my kop gebons teen 'n muur, maar dit lyk goed om te werk .. Maar dis die probleem met drade isnt dit .. die wisselende resultate wat jy kan kry wanneer jy dit uit te voer op verskillende tye.

Die proses moet nie 'n zombie geword, aangesien die Background draad gemerk as "agtergrond" en moet eindig wanneer die UI is gesluit.

Ek dink nie die Background ondersteun moord op die draad. Kanselleer 'n operasie gedoen moet word in die metode wat die werk verrig. In jou geval dink ek 'n gereelde draad sal die beste opsie wees.

Jy kan dit probeer:

            backgroundworker.Dispose();
            backgroundworker = null;
            GC.Collect(); //this helps cleans up ram
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top