Hej m$ och alla .net predikanter bruker väll predika att det är så fint med trådar för just dessa saker. Hej! Är det en egenutvecklad funktion så kan du använda delegates och lyssan på ett event. Låter bra. Fast kommer det verkligen bli någon skillnad mot att t.ex. bara anropa en metod som gör samma sak. Du skriver - "Delegates använder sig av appliakitonensn trådpool". Men det är väl samma huvudtråd sen när man ska uppdatera UI, eller ? och då har man ju samma problematik. nej .. huvudtråden blir fri att fortsätta exekveringen av appliaktionen, medans delagetn använder en egen tråd ur poolen och lämnar tillbaka den så fort den är klar.. Låter bra. Om det fungerar som du beskriver så får det bli min linje. Tack för tipset. Med risk att verka petig vill jag påstå att delegates inte använder windows trådpool. Delegates är bara ett sätt för C# att använda funktionspekare genom att omge dem med ett objekt, en delegate. Du harlite rätt, men inte helt. Ok. Jo men visst,, Ok. Då är jag med.Tråd eller ej
Jag har några ganska tidskrävande funktioner (läsning av fil samt en WebServise tjänst) och skulle vilja visa förloppet i en statusbar och progressbar. Känner mig lite villrådig på vilket sätt som är det bästa.
1. Att t.ex. köra filläsningen i en tråd. Då kommer status / progress att uppdateras.
2. Köra med lite Application.DoEvents() på lämpliga ställen.
3. Uppdaterar sig nämnda kontroller själva utan att jag behöver göra 1 eller 2. ?
Rent spontant känns 1 som den riktiga lösningen. Dock kanske lite för komplicerat eftersom jag har flera metoder som ska samverka och jag vet heller inte om jag vill ge användaren möjlighet att t.ex råka stänga fönstret. Sen kan man ju fundera på om man ska lägga t.ex. filläsningen eller kontroll uppdateringen i den nya tråden.
Många förvirrade tankar, tacksam för kloka ideér och synpunkter.Sv: Tråd eller ej
men man får väll se lite på vad som är syftet med det hela.
ska man kunna ladda en fil i bakgrunden och fortfarande använda applikationen?? , då skulle jag använda en tråd till det
ska applikationen enbart visa sin progressbar och använda 100% av cpu'n till att ladda filen så skulle jag nog använda DoEvents i en loop.
även om det är ganska ful kod , så är det ändå mindre som kan strula och lättare att följa koden....
du kan garanterat få dessa kontroller att refresha sig utan en doevents , men då blir ju appen helt låst och tar det lite mycket tid så kommer det ju bli en "svarar inte" i taskmanagern...(även om det sedan fortsätter när det är klart)
//RogerSv: Tråd eller ej
Vad gäller att läsa från fil borde du också kunna välja asynkron inläsning och välja att läsa in filen i delar. Då borde du få tid att uppdatera din "progress bar" då "callback" körs från den asynkrona läsningen.
Annars är trådar ganska enkelt och tacksamt att använda i .NET tycker jag.Sv: Tråd eller ej
Delegates använder sig av appliakitonensn trådpool på ett sätt att det inte bårkar lika mycket som om du spawnar egna trådar till höger och vänster..
// patrikSv: Tråd eller ej
Sv: Tråd eller ej
Sv: Tråd eller ej
/BjörneSv: Tråd eller ej
Däremot kanske det går att placera "events" i fönstrets meddelandekö.
Låter du en tråd köra en funktion i huvudprogrammet, antingen genom ett funktionsanrop eller med ett event via en delegate är det ju tråden som kör funktionen, inte huvudloopen. Kontrollera så att de objekt och kontroller du använder är "trådsäka".
AndersSv: Tråd eller ej
En delegate är en klass som omsluter en funktionspekare. Men när du anropar den med BeginInvoke eller liknande, använder den sig av en tråd ur appdomainens trådpool flr exekveringen.
Varje appdomain har sin egen uppsättning trådar i en pool, de är 25st standard. Vad du refererar till med windows trådpool förstår jag inte riktigt, då det är processen, eller i det här fallet appdomainen, som står för att leverera trådar till din applikation.
Enkelt sätt att kolla det är att kasta upp tråd fönstret, sätta en breakpoint i funktionen du ropar på med delageten och kolla tråd id't ;0)Sv: Tråd eller ej
Då är du inne på asynkron programmering, och det kanske är det man gör när man gör en Webservicetjänst?
Jag menade applikationens trådpool, inte windows trådpool. Det är ett uttryck du själv använt lite längre upp i denna trådpool...:)
Jag är annars van vid att använda delegates på detta sätt:
<code>
delegate void SomeOperation(int x);
Delegatefunc = new SomeOperation(SomeFunction);
int z = Delegatefunc(3); // Här anropas funktionen (i det här fallet, SomeFunction) direkt.
void SomeFunction(int x)
{
return x+3;
}
</code>Sv: Tråd eller ej
men om du itället ropar på BeginInvoke på delgate objektet. så får du asynkron exekvering av metoden. Sv: Tråd eller ej
Då är vi också inne på den asynkrona inläsningen av filen jag pratade om lite längre upp.