【发布时间】:2013-12-13 07:32:33
【问题描述】:
关注BackgroundWorker 有什么问题?
如果我尝试设置一些断点..bw_ProgressChanged 的值会更新,但如果我正在运行所有,我的 WPF 是“冻结”
public MainWindow()
{
InitializeComponent();
bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
}
private readonly BackgroundWorker bw = new BackgroundWorker();
private void btnStart_Click(object sender, RoutedEventArgs e)
{
if (!bw.IsBusy)
{
bw.DoWork += bw_DoWork;
bw.RunWorkerCompleted += bw_RunWorkerCompleted;
bw.ProgressChanged += bw_ProgressChanged;
bw.RunWorkerAsync();
}
}
private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.lblProgress.Content= e.ProgressPercentage.ToString()+ "%";
this.pb.Value = e.ProgressPercentage;
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
lblProgress.Content = "Cancel !";
else if (e.Error!=null)
lblProgress.Content= "Error: " + e.Error.Message;
else
lblProgress.Content = "Finish !";
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bw = sender as BackgroundWorker;
StreamReader sr = new StreamReader("C:\\File 1.txt");
StreamWriter sw = new StreamWriter("C:\\Out-File 1.txt");
var fi = new FileInfo("C:\\File 1.txt");
long total = (char)fi.Length;
int i = 0;
string result;
while (!sr.EndOfStream)
{
if (!bw.CancellationPending)
{
result = sr.ReadLine();
sw.WriteLine(result);
i = i + (char)result.Length;
bw.ReportProgress((int)((decimal)i / (decimal)total * (decimal)100));
}
else
{e.Cancel = true; break;}
} sw.Close(); sr.Close();
}
private void btnCancel_Click(object sender, RoutedEventArgs e)
{
if (bw.WorkerSupportsCancellation)
bw.CancelAsync();
}
}
【问题讨论】:
-
即使显示的百分比和以前一样,是否真的需要更新显示的百分比?
-
所以你是说你永远不会得到任何用户界面更新?如果你在
bw_ProgressChanged的第一行设置断点,它会触发吗? -
是的,我知道几个循环的值将保持不变...
-
@Nilzor 是的,它被触发了,我在
bw_ProgressChanged设置了一个断点,但是 WPF 是“冻结”..不能用鼠标移动...
标签: c# wpf backgroundworker