23. marts 2005 - 15:01
Der er
13 kommentarer og 1 løsning
StreamReader og Thread
Hej Jeg har bare lige et par spg omkring ovenstående emner (to uafhængige spg) Jeg har benyttet en streamreader til at læse ind fra en txt fil, som er placeret på et netværksdrev og jeg kan se det går ret langsomt med at læse fra txt filen. Skyldes at en stream reader ikke arbejder med data i RAM´en eller ?? Jeg har ligeledes en thread der læser fra en mappe, hvert 10. sekund og hvis der findes noget i den mappe, skal tråden behandle data og den behandling kan godt tage over 10 sekunder, så jeg kan se at den læser igen efter 10 sekunder, også selvom behandling af de fundne data ikke er afsluttet. Er det mig der gør noget forkert eller skal det virke sådan ??
Annonceindlæg fra Computerworld
23. marts 2005 - 15:03
#1
re 1) En StreamReader ville jeg tro bufferede noget. Men jeg ved ikke hvor meget. re 2) Hvis det er en timer, så skal den virke sådan.
23. marts 2005 - 15:20
#2
koden for min thread ses her: ThreadStart importFolderWorker = new ThreadStart(FolderWatcher.ReadImportFolder); Thread importFolderThread = new Thread(importFolderWorker); importFolderThread.Start(); while(true) { Thread.Sleep(10000); //sleep for 10 sec FolderWatcher.ReadImportFolder(); } Det er jo ikke en timer :-)
23. marts 2005 - 15:33
#3
No. den burde køre hver 10 sekunder + den tid det tager at lave ReadImportFolder
23. marts 2005 - 15:49
#4
så du mener den virker som den skal ??
23. marts 2005 - 16:03
#5
Jeg kan ikke rigtigt få koden og din beskrivelse af hvad der sker til at passe sammen Med den kode så burde det gå f.eks. 12, 14 og 13 sekunder mellem start hvis ReadImportFolder tog 2, 4 og 3 sekunder.
23. marts 2005 - 17:12
#6
okay, jeg skal poste noget mere kode efter påske :-)
04. april 2005 - 15:44
#7
Hej Arne Så har jeg kigget lidt mere på de her tråde og nedenstående kode, mener jeg, ikke virker efter hensigten.... using System; using System.Threading; namespace TestApp { class TestApp { public static void test() { Console.WriteLine("tråd sov! " + DateTime.UtcNow.ToString()); Thread.Sleep(10000); Console.WriteLine("tråd vågn! " + DateTime.UtcNow.ToString()); } public void StartThread() { ThreadStart Worker = new ThreadStart(TestApp.test); Thread WorkerThread = new Thread(Worker); WorkerThread.Start(); Console.WriteLine("tråd start " + DateTime.UtcNow.ToString()); while(true) { Thread.Sleep(5000); TestApp.test(); } } [STAThread] static void Main(string[] args) { TestApp app = new TestApp(); app.StartThread(); } } } Når programmet kører bliver der udskrevet: tråd start 04/04/2005 13:45:21 tråd sov! 04/04/2005 13:45:21 tråd sov! 04/04/2005 13:45:26 tråd vågn! 04/04/2005 13:45:31 tråd vågn! 04/04/2005 13:45:36 tråd sov! 04/04/2005 13:45:41 tråd vågn! 04/04/2005 13:45:51 tråd sov! 04/04/2005 13:45:56 og hvis det virkede som det skulle, burde den ikke udskrive "tråd sov" to gange i træk.......eller er det mig der tager fejl ??
04. april 2005 - 16:09
#8
Hvorfor ikke ? Du har 2 tråde kørende som begge laver: start sov 10 sek. stop og det er vel ikke overraskende at det giver: tråd 1 start tråd 2 start tråd 1 stop tråd 2 stop
04. april 2005 - 17:47
#9
hmm, okay jeg prøver igen med et eksempel der er identisk med mit program..... using System; using System.Threading; namespace TestApp { class MainClass { public void StartThread() { ThreadStart Worker = new ThreadStart(WorkerClass.DoWork); Thread WorkerThread = new Thread(Worker); WorkerThread.Start(); Console.WriteLine("tråd start " + DateTime.UtcNow.ToString()); while(true) { Thread.Sleep(5000); WorkerClass.DoWork(); } } [STAThread] static void Main(string[] args) { MainClass mc = new MainClass(); mc.StartThread(); } } } using System; namespace TestApp { /// <summary> /// Summary description for test. /// </summary> public class WorkerClass { public WorkerClass() { // // TODO: Add constructor logic here // } public static void DoWork() { Console.WriteLine("tråd arbejd start! " + DateTime.UtcNow.ToString()); long k = 0; for(long i=0; i<=1000000000; i++) { k = i; } Console.WriteLine(k); Console.WriteLine("tråd arbejd slut! " + DateTime.UtcNow.ToString()); } } } Programmet giver følgende output: tråd start 04-04-2005 15:42:09 tråd arbejd start! 04-04-2005 15:42:09 tråd arbejd start! 04-04-2005 15:42:14 1000000000 tråd arbejd slut! 04-04-2005 15:42:15 1000000000 tråd arbejd slut! 04-04-2005 15:42:20 tråd arbejd start! 04-04-2005 15:42:25 Hvordan sørger jeg for kun at ha een tråd kørende, når nu de to tråde ikke venter på hinanden ?
04. april 2005 - 18:09
#10
Du har flere muligheder: 1) du kan bede main thread vente på at den startede tråd afslutter 2) du kan synkronisere med lock/Monitor/Mutex
04. april 2005 - 18:10
#11
#1 er med Thread Join metoden.
10. april 2005 - 17:26
#12
OK ?
12. april 2005 - 10:01
#13
jeg har ikke lige kunnet gennemskue hvordan jeg benytter Join metoden, så hvis du har et eksempel på det, ville det jo være alletiders :-)
12. april 2005 - 10:05
#14
Thread t = new Thread(new ThreadStart(noget)); t.Start(); ... t.Join();
Kurser inden for grundlæggende programmering