Avatar billede wedia Nybegynder
13. marts 2012 - 23:06 Der er 8 kommentarer og
1 løsning

problem med multi threading

Hej Eksperten,

Jeg er helt ny når det kommer til multi trådning men er begyndt at lege med det men jeg er stødt ind i et problem, jeg ved ikke hvad problemet ligger i men jeg har neden stående kode men hvis jeg køre den fryser winform'en og der sker ingen ting ?? Er der nogle der kan hjælpe!!

public partial class Form1 : Form
    {
        public Queue<string> queue = new Queue<string>();
       
        public bool isRunning = true;
        int ActivThreads = 0;
        string Info = "";
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            for (int x = 0; x < 1000; x++)
            {
                queue.Enqueue(x.ToString());
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
           
            timer1.Enabled = true;
            allSiteUrls.Add(SendUrl);
            int i = 0;
            while (isRunning)
            {
                Thread thread = new Thread(new ThreadStart(this.ThreadWork),1024);
                thread.IsBackground = true;
                thread.Name = "My Worker " + i;
                thread.Start();
                i++;
            }
             
        }

        public void ThreadWork()
        {

            sting isQ = ""
            lock (queue)
            {
                if (queue.Count > 0)
                {
                    if (ActivThreads < 4)
                    {
                        isQ = queue.Dequeue();
                        SomeWork(isCrawlUrl, Thread.CurrentThread.Name);
                        ActivThreads++;

                    }
                    else
                    {
                        Thread.Sleep(25);
                    }

                }
                else
                {
                    isCrawling = false;
                }

             
            }


        }

        public void SomeWork(string isQ,string Name)
        {
            Info += Name + "|" + isQ+ "\n";
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
         
            if (isRunning)
            {
                label1.Text = Info;
            }
            else
            {
                label1.Text = "Threading end";
                timer1.Enabled = false;
            }
        }
    }
Avatar billede wedia Nybegynder
13. marts 2012 - 23:09 #1
isCrawlUrl er blevet ændret til isQ
og linjen  allSiteUrls.Add(SendUrl); er slettet men problemet er der stadig!!
Avatar billede wedia Nybegynder
13. marts 2012 - 23:09 #2
og isCrawling er rettet til isRunnng
Avatar billede Syska Mester
13. marts 2012 - 23:22 #3
Din mail thread låser i din metoder:
"button1_Click"

indtil du sætter isRunning til false. Det gør du faktisk ingen steder ... så ja, dit program er i en deadlock.

Du skal give dette arbejde videre til en anden tråd ellers vil du opleve hvad du gør, da din main tråd er låst og derfor ikke kan opdatere din GUI. Folk kalder den også for GUI tråden. Arbejde der bør MAX tage et par hundrede ms ellers bør du give arbejdet videre til en anden tråd end main thread.
Avatar billede arne_v Ekspert
13. marts 2012 - 23:22 #4
starter du ikke en masse nye traade i en loekke i en click event?

det skal faa GUI til at haenge
Avatar billede wedia Nybegynder
14. marts 2012 - 07:58 #5
Jeg er jo helt ny når det kommer til tread programering så har i mulighed for at give et eks. på hvordan kode skulle se ud for at køre som den skal?
Avatar billede Syska Mester
14. marts 2012 - 09:05 #6
Ikke lige ved hånden, men alt efter hvad du skal lave kan du kigge på: http://msdn.microsoft.com/en-us/library/8xs8549b.aspx

http://msdn.microsoft.com/en-us/library/hybbz6ke.aspx

Det er i hvert fald en nemmere måde at løse det på.

mvh
Avatar billede heinzdmx Nybegynder
14. marts 2012 - 11:00 #7
Vil anbefale dig til enten at bruge en BackgroundWorker som Buzz linker til.
Hvis du har mulighed for .NET 4.5 så kig på det nye async og await sammen med Task.Factory.StartNew til multithreading.

Hvis man er ny (eller garvet) og vil bruge flere tråde kan System.Collections.Concurrent namespacet også være en mulighed, da den indeholder lock-funktionerne i sig selv.

F.eks.

ConcurrentQueue
Avatar billede wedia Nybegynder
19. marts 2012 - 22:12 #8
Jeg har fået det til at virke ved at bruge backgroundworker. men smid nogle svar!
Avatar billede Syska Mester
19. marts 2012 - 22:46 #9
svar
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