Avatar billede bildsoe Nybegynder
28. juli 2011 - 11:32 Der er 6 kommentarer og
1 løsning

Strategi til implementering af BackgroundWorker

Hej

Jeg er ved at lave en sagsbehandlingsapplikation og har bygget den op som et 3-tier system, med separat datalag, forretningslag og præsentationslag. Mit datalag består af et repository der bruger ORM i form af MS Entity Framework til at hente data fra databasen.

Da der er nogle af de data jeg skal hente, der vil tage tid at hente, vil jeg gerne undgå at brugerinterfacet låser imens og har derfor set på at bruge BackgroundWorker til at hente dem med. Men er kommet lidt i tvivl om, hvor man implementerer denne. Gør jeg det i datalaget, forretningslaget eller præsentationslaget? og hvordan sender man information til præsentationslaget? hvis jeg gerne vil lave en grafisk indikator af processen.

Jeg tror ikke der bliver brug for noget locking eller lign. fordi databasen selv sørger for concurrency control.
Avatar billede janus_007 Nybegynder
28. juli 2011 - 19:41 #1
Hej bildsoe

Det er en winform du har lavet ik?
Avatar billede bildsoe Nybegynder
28. juli 2011 - 20:30 #2
Hov jo! Winforms, .Net 4.0, EF 4.1 og C#.
Avatar billede janus_007 Nybegynder
28. juli 2011 - 22:02 #3
Så synes jeg du skal kigge lidt på SynchronizationContext sådan at du undgå diverse sære ui-locks når det handler om præsentationslaget :)

Et lille pseudo eksempel som jeg husker....

SynchronizationContext context;

Form_Load(object sender, EventArgs e)
{
this.context = SynchronizationContext.Current; // her fanger du contexten som dine metoder efterfølgende kan kalde med ind i præsentationslaget
}

void btnLongRunning(...)
{
var foo = new Foo();
foo.DataLoaded  += OnDataLoaded; //setup delegate
backgroundWorker1.RunWorkerAsync(foo.CallLongRunningProcess()); // din drag and drop ting :)
}

void OnDataloaded(object sender, EventArgs e)
{
SendOrPostCallback callback = null;
callback = (delegate{
someLabel.Text = "Data Loaded";
});
context.Post(callback, null); // og tilsidst en async besked til en sync process (main er syncet, det er foo som er out of sync :)
}


... another class
public class Foo
{
public event EventHandler DataLoaded = delegate{};
public void CallLongRunningProcess()
{
....
OnComplete....
//null checkk.... and raise
DataLoaded(this, EventArgs.Empty);
}
}


Håber det giver lidt information... der findes sikkert nogle mere udførlige eksempler på nettet, men SynchronizationContext  er den gode måde at gøre det på synes jeg :)
Der er muligt der er lidt koks i min syntax, men det giver da et fingerprej .-)
Avatar billede bildsoe Nybegynder
29. juli 2011 - 09:49 #4
Tak for svaret janus_007, jeg vil helt sikkert kigge lidt på SynchronizationContext. Fandt også noget der hedder Mutex.

Men er stadig lidt i tvivl om, hvorhenne jeg placerer jeg koden. Er det i præsentationslaget? Eller måske rettere, hvor det er mest fornuftigt at placere koden?
Avatar billede janus_007 Nybegynder
29. juli 2011 - 13:02 #5
Ja SynchronizationContext skal ligge i ui'en.

Mutex er noget du anvender i dine tråde ikke i UI :) eks.vis hvis flere tråde skal tilgå den samme fil /IO (eller måske en db reader ;-) )
Avatar billede bildsoe Nybegynder
29. juli 2011 - 13:08 #6
Ok tak! Smider du ikke et svar så får du point!
Avatar billede janus_007 Nybegynder
30. juli 2011 - 21:30 #7
Jes :)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester