Vra

Ek probeer 'n paar asynchrone goed in 'n webdiensmetode doen.Kom ons sê ek het die volgende API-oproep: http://www.example.com/api.asmx

en die metode word genoem GetProducts().

Met hierdie GetProducts-metodes doen ek 'n paar dinge (bv.kry data vanaf die databasis), dan wil ek net voor ek die resultaat terugstuur 'n paar asynchrone dinge doen (bv.stuur vir my 'n e-pos).

So dit is wat ek gedoen het.

[WebMethod(Description = "Bal blah blah.")]
public IList<Product> GetProducts()
{
    // Blah blah blah ..
    // Get data from DB .. hi DB!
    // var myData = .......
    // Moar clbuttic blahs :)  (yes, google for clbuttic if you don't know what that is)

    // Ok .. now send me an email for no particular reason, but to prove that async stuff works.
    var myObject = new MyObject();
    myObject.SendDataAsync();

    // Ok, now return the result.
    return myData;
    }
}

public class TrackingCode
{
    public void SendDataAsync()
    {
        var backgroundWorker = new BackgroundWorker();
        backgroundWorker.DoWork += BackgroundWorker_DoWork;
        backgroundWorker.RunWorkerAsync();
        //System.Threading.Thread.Sleep(1000 * 20);
    }

    private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        SendEmail();
    }
}

Nou, wanneer ek hierdie kode hardloop, word die e-pos nooit gestuur nie.As ek die Draad uitteken. Slaap ..dan word die e-pos gestuur.

So...hoekom is die agtergrond werker draad afgebreek?is dit afhanklik van die ouer draad?Is dit die verkeerde manier waarop ek agtergrond- of gevurkte draadwerk in asp.net-webtoepassings moet doen?

Was dit nuttig?

Oplossing

BackgroundWorker is nuttig wanneer jy terug na (byvoorbeeld) 'n UI*-draad moet sinchroniseer, bv. vir affiniteitsredes.In hierdie geval wil dit voorkom asof dit bloot gebruik word ThreadPool sou meer as voldoende (en baie eenvoudiger) wees.As jy hoë volumes het, kan 'n produsent/verbruiker-tou dalk beter versmooring toelaat (sodat jy nie in drade verdrink nie) - maar ek vermoed ThreadPool sal goed gaan hier...

public void SendDataAsync()
{
    ThreadPool.QueueUserWorkItem(delegate
    {
        SendEmail();
    });
}

Ook - ek is nie heeltemal seker wat jy wil bereik deur te slaap nie?Dit sal net 'n draad vasbind (nie gebruik van SVE nie, maar dit doen ook niks).Wil jy uitbrei?Dit lyk asof jy jou werklike webblad onderbreek (d.w.s.die Slaap vind plaas op die webbladdraad, nie die e-posdraad nie).Wat probeer jy hier doen?

*=Eintlik sal dit enige sinchronisasie-konteks gebruik wat in plek is

Ander wenke

Re produsent/verbruiker;basies - dit is net die moeite werd om te hou sommige soort versneller.Op die eenvoudigste vlak, a Semaphore kan gebruik word (saam met die gewone ThreadPool) om dinge te beperk tot 'n bekende hoeveelheid werk (om te verhoed dat die draadpoel versadig word);maar 'n produsent/verbruiker-tou sal waarskynlik meer doeltreffend en bestuur word.

Jon Skeet het so 'n tou hier (CustomThreadPool).Ek kan seker 'n paar notas daaroor skryf as jy wil.

Dit het gesê:as jy na 'n eksterne webwerf skakel, is dit heel waarskynlik dat jy baie wag op netwerk IO / voltooiingpoorte sal hê;as sodanig kan jy 'n effens groter aantal drade hê ...natuurlik (in teenstelling) as die werk SVE-gebonde was, is dit geen punt om meer drade te hê as wat jy SVE-kerne het nie.

Dit kan dalk afgebreek word, want na 20 sekondes kan daardie BackgroundWorker-instansie as vullis versamel word omdat dit geen verwysings het nie (buite omvang).

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top