28. juli 2011 - 11:32Der 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.
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 .-)
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?
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.