Click here to Skip to main content
16,016,345 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi All,

I Have created a win form app in which there is some performance related issue. my Issues is as below.

I have used a tab control in which I have Four tabs.
From one of the tab I set the upload path of my Csv Files.
Now when ever I have large amount of file (say 2000 csvs) at that time application get hang.

I want to things to do.
1) Want to speed up the csv uploading process.
2) right now when file are getting uploaded at that time i can't Move between my tabs as application got hang. so I need to move around my tabs during the file uploading take place.

Waiting for your reply
Rajan Bajania
Posted
Comments
[no name] 22-Jul-13 6:50am    
You need to look into using a background thread.
Herman<T>.Instance 22-Jul-13 9:48am    
set is as an answer so I can give you a +5!
TrekkieTech 22-Jul-13 7:19am    
ThePhantomUpvoter is correct - you need to do the file upload process within a background thread so that it does not block your programs UI while the upload is taking place.

Clarification : your program does not 'hang' as such - it seems to because the main UI thread is busy performing the CSV upload tasks and therefore cannot respond to user input.

How are you uploading your CSV files? via FTP?

If you are using FTP then it is quite simple to use asynchronous FTP transfer so that the program UI thread is not blocked.
RBajania 22-Jul-13 7:55am    
No Files are in my PC.
and on that file I am performing conditions and generating tree view.
I Need one thing to do that when files get upload at that time a progress bar comes in place to display a message like "Processing "n" th File of "My total Files" count. " and system not get hang so user can move in system.
If you can provide me any link then it would be great for me.
Herman<T>.Instance 22-Jul-13 9:49am    
the backgroundworker uses multithreading with reporting options. So your UI can be used while processing the CSV files. You can also use a second thread together with events and delegates to get the same result. Backgroundworker is more easily to learn.

1 solution

Obviously the best solution is with a background worker.
Copied below is a sample code i found,

It uses a progress bar as you required. The backgroundworker do the process without slowing the other tasks.


The solution for your problem can be achieved from the explanation in this
http://ntsblog.homedev.com.au/index.php/2012/03/30/background-worker-thread-code-sample-event-handlers-cross-thread-invoke/[^]



using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace BackgroundWorkerThreadExample
{
    public partial class Form1 : Form
    {
        public delegate void ProgressUpdatedCallaback(ProgressUpdatedEventArgs progress);
        BackgroundWorker bw = new BackgroundWorker();

        public Form1()
        {
            InitializeComponent();
            bw.WorkerReportsProgress = true;
            bw.WorkerSupportsCancellation = true;
            bw.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
        }

        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            DatabaseProcessor.ProgressUpdated += new DatabaseProcessor.ProgressUpdatedEvent(ProgressUpdated);
            DatabaseProcessor.GetData();
        }

        private void backgroundWorker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
        {
            bw.Dispose();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            bw.RunWorkerAsync();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (bw.IsBusy == true)
            {
                bw.CancelAsync();
            }
            bw.Dispose();
        }

        private void ProgressUpdated(ProgressUpdatedEventArgs progressUpdated)
        {
            if (InvokeRequired)
            {
                Invoke(new ProgressUpdatedCallaback(this.UpdateProgress), new object[] { progressUpdated });
            }
            else
            {
                UpdateProgress(progressUpdated);
            }
        }

        private void UpdateProgress(ProgressUpdatedEventArgs args)
        {
            ProgressBar pb = new ProgressBar();
            Label lb = new Label();

            if (args.Message == "")
            {
                if (args.PBNum == 1)
                {
                    pb = progressBar1;
                    lb = label1;
                }
                else if (args.PBNum == 2)
                {
                    pb = progressBar2;
                    lb = label2;
                }

                if (pb.Maximum != args.Total)
                {
                    // initial setup
                    pb.Minimum = 0;
                    pb.Maximum = args.Total;
                    pb.Style = ProgressBarStyle.Continuous;
                }

                pb.Value = args.Processed;

                if (args.Total > 0)
                {
                    double progress = args.Processed / (args.Total * 1.0);
                    lb.Text = progress.ToString("P2");
                }
            }
            else
            {
                this.richTextBox1.Text += args.Message;
                //Goto last line
                this.richTextBox1.SelectionStart = this.richTextBox1.Text.Length;
                this.richTextBox1.ScrollToCaret();
            }
            //Application.DoEvents();
        }
    }

    public static class DatabaseProcessor
    {
        public delegate void ProgressUpdatedEvent(ProgressUpdatedEventArgs progressUpdated);
        public static event ProgressUpdatedEvent ProgressUpdated;

        public static void GetData()
        {
            int total = 126;
            Random randomGenerator = new Random();
            for (int i = 0; i < total; i++)
            {
                // Do some processing here
                double delay = (double)randomGenerator.Next(2) + randomGenerator.NextDouble();
                int sleep = (int)delay * 1000;
                System.Threading.Thread.Sleep(sleep);
                RaiseEvent(1, total, i + 1);
                RaiseEvent(0, 0, 0, string.Format("Processing Item {0} \r\n", i + 1));

                for (int ii = 0; ii < total; ii++)
                {
                    // Do some processing here
                    double delay2 = (double)randomGenerator.Next(2) + randomGenerator.NextDouble();
                    int sleep2 = (int)delay2 * 10;
                    System.Threading.Thread.Sleep(sleep2);
                    RaiseEvent(2, total, ii + 1);
                }
            }
        }

        private static void RaiseEvent(int pbNum, int total, int current, string message = "")
        {
            if (ProgressUpdated != null)
            {
                ProgressUpdatedEventArgs args = new ProgressUpdatedEventArgs(pbNum, total, current, message);
                ProgressUpdated(args);
            }
        }
    }

    public class ProgressUpdatedEventArgs : EventArgs
    {
        public ProgressUpdatedEventArgs(int pbNum, int total, int progress, string message = "")
        {
            this.PBNum = pbNum;
            this.Total = total;
            this.Processed = progress;
            this.Message = message;
        }
        public string Message { get; private set; }
        public int PBNum { get; private set; }

        public int Processed { get; private set; }
        public int Total { get; private set; }
    }
}
 
Share this answer
 
v2

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900