User interface 由于文本框更新,用户界面冻结

User interface 由于文本框更新,用户界面冻结,user-interface,backgroundworker,freeze,User Interface,Backgroundworker,Freeze,偶尔,我的UI会冻结。它是以一种看似随机的方式这样做的。有时,对我的文本框进行大的更新(多达几千行)似乎不会引起任何问题。在其他时候,即使是小的文本更新(我说的是200-300行)也会导致UI冻结,直到整个线程完成 我知道线程安全,但是线程安全也能提高UI性能吗 private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { progre

偶尔,我的UI会冻结。它是以一种看似随机的方式这样做的。有时,对我的文本框进行大的更新(多达几千行)似乎不会引起任何问题。在其他时候,即使是小的文本更新(我说的是200-300行)也会导致UI冻结,直到整个线程完成

我知道线程安全,但是线程安全也能提高UI性能吗

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
            lblProgress.Text = e.ProgressPercentage.ToString() + "%";
            lblCurrentItem.Text = "Last item completed... " + currentItemName;

            List<string> result = new List<string>();
            result = (List<string>)e.UserState;

            System.IO.File.AppendAllLines(logFile, result);
            

            if (cbOutputToScreen.Checked)
            {
                foreach (string line in result)
                {
                    textBox2.Text += line + nl;
                }
            }           
            
        }

private void btnGet_Click(object sender, EventArgs e)
        {
            btnGet.Enabled = false;
            btnCancel.Enabled = true;
            textBox2.Text = "";

            object[] parameters = new object[] { cmbWhichReport.Text };
            backgroundWorker1.RunWorkerAsync(parameters);
        }

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {          
            object[] parameters = e.Argument as object[];
            string[] strArray;
            strArray = textBox1.Text.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);

            int objectCount = strArray.Count();
            int count = 0;

            string whichReport = (string)parameters[0];

            foreach (string str in strArray)
            {
                if (backgroundWorker1.CancellationPending)
                {                    
                    e.Cancel = true;
                    e.Result = str;
                    return;
                }

                List<string> result = new List<string>();
               

                if (whichReport.StartsWith("01"))
                    result = getUserGroupMembership(str, false);

                if (whichReport.StartsWith("02"))
                    result = getUserGroupMembership(str, true);

                if (whichReport.StartsWith("11"))
                    result = getGroupMembers(str);

                if (whichReport.StartsWith("12"))
                    result = getGroupAttributes(str);

                if (whichReport.StartsWith("21"))
                    result = getComputerAttributes(str);

                if (whichReport.StartsWith("22"))
                    result = getComputerLastLogonAndSPNs(str);

                if (whichReport.StartsWith("23"))
                    result = getComputerServices(str);

                if (whichReport.StartsWith("24"))
                    result = getLocalGroupMembers(str, "Administrators");

                if (whichReport.StartsWith("25"))
                    result = getLocalGroupMembers(str, "Server Operators");

                if (whichReport.StartsWith("31"))
                    result = getObjectClass(str);


                currentItemName = str;
                count++;
                backgroundWorker1.ReportProgress((100 * count) / objectCount, result);
            }
        }

        

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled)
                MessageBox.Show("The operation was cancelled");

            btnGet.Enabled = true;
            btnCancel.Enabled = false;
            lblCurrentItem.Text = lblCurrentItem.Text + " ...stopped";
        }

private void backgroundWorker1\u ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
progressBar1.值=e.ProgressPercentage;
lblProgress.Text=e.ProgressPercentage.ToString()+“%”;
lblCurrentItem.Text=“最后一项完成…”currentItemName;
列表结果=新列表();
结果=(列表)e.UserState;
System.IO.File.AppendAllLines(日志文件、结果);
如果(CBOUTPUTOSCREEN.Checked)
{
foreach(结果中的字符串行)
{
textBox2.Text+=line+nl;
}
}           
}
私有void btnGet\u单击(对象发送方,事件参数e)
{
btnGet.Enabled=false;
btnCancel.Enabled=真;
textBox2.Text=“”;
object[]parameters=新对象[]{cmbWhichReport.Text};
backgroundWorker1.RunWorkerAsync(参数);
}
私有void backgroundWorker1\u DoWork(对象发送方,DoWorkEventArgs e)
{          
对象[]参数=e.参数作为对象[];
字符串[]strArray;
strArray=textBox1.Text.Split(新字符串[]{Environment.NewLine},StringSplitOptions.None);
int objectCount=strArray.Count();
整数计数=0;
字符串whichReport=(字符串)参数[0];
foreach(strArray中的字符串str)
{
if(backgroundWorker1.CancellationPending)
{                    
e、 取消=真;
e、 结果=str;
返回;
}
列表结果=新列表();
如果(报告以“01”开头)
结果=getUserGroupMembership(str,false);
如果(报告以“02”开头)
结果=getUserGroupMembership(str,true);
如果(报告以“11”开头)
结果=getGroupMembers(str);
如果(报告以“12”开头)
结果=getGroupAttributes(str);
如果(报告以(“21”)开头)
结果=getComputerAttributes(str);
如果(该报告以“22”开头)
结果=GetComputerLastLogon和SPNS(str);
如果(报告以(“23”)开头)
结果=getComputerServices(str);
如果(报告开始于(“24”))
结果=getLocalGroupMembers(str,“Administrators”);
如果(报告以(“25”)开头)
结果=getLocalGroupMembers(str,“服务器操作员”);
如果(报告以(“31”)开头)
结果=getObjectClass(str);
currentItemName=str;
计数++;
backgroundWorker1.ReportProgress((100*count)/objectCount,结果);
}
}
私有void backgroundWorker1\u RunWorkerCompleted(对象发送方,runworkercompletedeventarge)
{
如果(如已取消)
MessageBox.Show(“操作已取消”);
btnGet.Enabled=true;
btnCancel.Enabled=false;
lblCurrentItem.Text=lblCurrentItem.Text+“…已停止”;
}