Thursday, April 16, 2009

Load UI first and then load time consuming process in the background.

- Use BackgroundWorker component from windows component tool bar.

e.g.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
            backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
            listBox1.Items.Add("wait pls..");
        }

    

        void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            Person p = e.Argument as Person;
            Console.WriteLine(p.Name);
            e.Result = new Person("Someone else", 28);
            Thread.Sleep(5000);
        }

        void DoWait()
        {
            Thread.Sleep(5000);
            listBox1.Items.Clear();
            listBox1.Items.Add("test");

        }

        void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            listBox1.Items.Clear();
            Person developer = e.Result as Person;
            listBox1.Items.Add(developer.Name);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Person developer = new Person("a developer", 33);
            backgroundWorker1.RunWorkerAsync(developer);
        }
    }

    public class Person
    {
        public Person(string name, int age)
        {
            Name = name;
            Age = age;
        }

        private int age;

        public int Age
        {
            get { return age; }
            set { age = value; }
        }

        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }


    }
}

No comments:

Post a Comment