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