BackgroundWorker

    Date: 03/15/08 (C Sharp)    Keywords: no keywords

    I'm playing around with the BackgroundWorker class. Since I've never used it before I was hoping to get some critique. The code works fine but it's probably not using best practices (throughout). I'm using a form with a listbox, button, and timer. Please assume that 'Files' will never contain duplicate names. I don't think any lock() blocks are necessary but I might be wrong.


    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Threading;
    using System.Windows.Forms;
    
    namespace ThreadTest
    {
        public partial class Form1 : Form
        {
            private const int THREADMAX = 3;
            private ArrayList Files, Running;
            private BackgroundWorker[] Bgw;
            private Loader Ldr;
    
            public Form1()
            {
                InitializeComponent();
                Files = new ArrayList(10);
                Bgw = new BackgroundWorker[THREADMAX];
                Running = new ArrayList(THREADMAX);
                Ldr = new Loader();
                for (int x = 0; x < 10; x++) {
                    Files.Add(x.ToString());
                }
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                string s;
    
                timer1.Start();
                while (Files.Count != 0) {
                    s = Files[0].ToString();
                    if (Running.Count < THREADMAX) {
                        for (int x = 0; x < THREADMAX; x++) {
                            if (Bgw[x] == null || !Bgw[x].IsBusy) {
                                Bgw[x] = new BackgroundWorker();
                                Bgw[x].DoWork += new DoWorkEventHandler(Ldr.Load);
                                Bgw[x].RunWorkerCompleted += new RunWorkerCompletedEventHandler(Done);
                                listBox1.Items.Add("Loading " + s);
                                Running.Add(s);
                                Bgw[x].RunWorkerAsync(s);
                                Files.Remove(s);
                                break;
                            }
                        }
                    }
                    Application.DoEvents();
                }
            }
    
            private void Done(object sender, RunWorkerCompletedEventArgs e)
            {
                Running.Remove(e.Result.ToString());
                listBox1.Items.Add("Load complete for " + e.Result.ToString());
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                if (Files.Count == 0 && Running.Count == 0) {
                    listBox1.Items.Add("Done!");
                    timer1.Stop();
                }
            }
        }
    
        public class Loader
        {
            public void Load(object sender, DoWorkEventArgs e)
            {
                e.Result = e.Argument.ToString();
                Thread.Sleep(1000);
            }
        }
    }
    


    Thanks!

    Source: http://community.livejournal.com/csharp/94902.html

« MRE's and multithreading || Vista/2k3 C# Packet Capturing »


antivirus | apache | asp | blogging | browser | bugtracking | cms | crm | css | database | ebay | ecommerce | google | hosting | html | java | jsp | linux | microsoft | mysql | offshore | offshoring | oscommerce | php | postgresql | programming | rss | security | seo | shopping | software | spam | spyware | sql | technology | templates | tracker | virus | web | xml | yahoo | home