c# 后台程序

C# 中的backgroundworker,是我个人认为最具有吸引力的windows标准控件之一,他允许程序在后台运行一个独立的线程,而不影响前台主窗口。这种进程控制在操作数据库或通讯时非常实用,因为后台线程在工作时并不影响前台的任何操作。如果不使用backgroundworker而简单的应用单一线程操作,则通讯时很有可能会造成主窗口假死,知道通讯结束后才会恢复。下面简单介绍了backgroundworker的用法:

#region ( worker 1 )
        
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            e.Result 
= NormalTest(backgroundWorker1, e);
        }

        
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            ProgressBar1.Value 
= e.ProgressPercentage;
            Label1.Text 
= ProgressBar1.Value.ToString() + "%";
            Label1.BackColor 
= Color.Orange;
            Label1.ForeColor 
= Color.White;
        }

        
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            
if (position == 0)
            {
                Label1.BackColor 
= Color.Green;

                Button_Run1.Enabled 
= true;
                Button_Pause1.Enabled 
= false;
                Button_Resume1.Enabled 
= false;
                Button_Stop1.Enabled 
= false;

            }
        }
 
#endregion

        
private void Button_Run1_Click(object sender, EventArgs e)
        {
            position 
= 0;
     
            backgroundWorker1.RunWorkerAsync();
   
            Button_Run1.Enabled 
= false;
            Button_Pause1.Enabled 
= true;
            Button_Resume1.Enabled 
= false;
            Button_Stop1.Enabled 
= true;
        }


        
private void Button_Pause1_Click(object sender, EventArgs e)
        {
         
            backgroundWorker1.CancelAsync();
   

            Button_Run1.Enabled 
= false;
            Button_Pause1.Enabled 
= true;
            Button_Resume1.Enabled 
= true;
            Button_Stop1.Enabled 
= true;
        }

        
private void Button_Resume1_Click(object sender, EventArgs e)
        {
           
             backgroundWorker1.RunWorkerAsync();
       

            Button_Run1.Enabled 
= false;
            Button_Pause1.Enabled 
= true;
            Button_Resume1.Enabled 
= false;
            Button_Stop1.Enabled 
= true;
        }
        
private void Button_Stop1_Click(object sender, EventArgs e)
        {
            position 
= 0;
            
            backgroundWorker1.CancelAsync();

            Button_Run1.Enabled 
= false;
            Button_Pause1.Enabled 
= true;
            Button_Resume1.Enabled 
= false;
            Button_Stop1.Enabled 
= true;
        }

        
private int NormalTest(BackgroundWorker work, DoWorkEventArgs e)
        {
            
#region [ Pause Testing ]
            
if (work.CancellationPending)
            {
                
return position;
            }
            
#endregion

            
for (int i = position; i < nop; i++)
            {
                
#region [ Pause Testing ]
                
if (work.CancellationPending)
                {
                    
return position;
                }
                
#endregion
               
                ..

                position 
= i;
                work.ReportProgress((position 
+ 1* 100 / nop);
            }

            position 
= 0;

            
return position;
         }

有一点需要注意,backgroundworker不能直接操作前台windows窗口中的控件,否则会引起线程的不安全。
posted on 2009-08-25 13:38  lgfcs  阅读(3563)  评论(0)    收藏  举报