我在这里看到了一些很棒的答案,并且想知道是否有人可以帮助我。
这是我的代码:
namespace expandGUIWPF
{
public static string getSHA256b64(string filepath)
{
byte[] bytes = SHA256.Create().ComputeHash(File.ReadAllBytes(filepath));
return Convert.ToBase64String(bytes);
}
private void btnRun_Click(object sender, RoutedEventArgs e)
{
{
string folder = txtFolder.Text;
string filelist = folder + "\\FileList.txt";
string[] test = Directory.GetFiles(folder, "*", System.IO.SearchOption.AllDirectories);
File.WriteAllLines(filelist, test);
int length = File.ReadLines(filelist).Count();
pBar1.Minimum = 1;
pBar1.Maximum = length;
File.WriteAllLines(filelist, test);
using (StreamReader sr = new StreamReader(filelist))
{
string line;
while ((line = sr.ReadLine()) != null)
{
string oldfile = line;
string newfile = oldfile + ".expanded";
string oldhash = "";
string newhash = "";
try
{
ProcessStartInfo startInfo = new ProcessStartInfo(@"C:\test\test.exe", oldfile + " " + newfile);
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
Process.Start(startInfo);
Thread.Sleep(1000);
if (File.Exists(oldfile))
{
oldhash = getSHA256b64(oldfile);
}
if (File.Exists(newfile))
{
newhash = getSHA256b64(newfile);
File.Delete(oldfile);
File.Move(newfile, oldfile);
}
pBar1.Value = pBar1.Value + 1;
txtLog.AppendText(oldfile + "\r\n Old: " + oldhash + "\r\n New: " + newhash + "\r\n");
if (!(oldhash == newhash))
{
txtLog.AppendText("Successfully expanded file \r\n");
}
else
{
txtLog.AppendText("Unable to expand file \r\n");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
}
}
}
}
问题是我的进度条没有更新。我知道一点C#但我是WPF的初学者,并且无法理解设置后台工作者来更新我的UI。有人可以给我一些指示吗?目前该应用程序工作正常,但进度条跳转到100%完成,所有文本突然出现。
提前致谢!
汤姆
答案 0 :(得分:1)
首先,您希望后台工作人员处理 DoWork 事件中的进程。在该事件中,您可以调用 ProgressChanged 事件来更新进度条。以下是一个例子:
private void btnRun_Click(object sender, RoutedEventArgs e)
{
if(workerThread.IsBusy == false) // Make sure someone doesn't click run multiple times by mistake
{
pBar1.Value = 0;
workerThread.RunWorkerAsync();
}
}
private void workerThread_DoWork(object sender, DoWorkEventArgs e)
{
// Definitions and so forth
pBar1.Minimum = 0;
pBar1.Maximum = length;
int status = 0;
using (StreamReader sr = new StreamReader(filelist))
{
string line;
while ((line = sr.ReadLine()) != null)
{
// Try/Catch work here
status++;
workerThread.ReportProgress(status);
}
}
private void workerThread_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pBar1.Value = e.ProgressPercentage;
}
答案 1 :(得分:0)
请理解,运行表单的主题与用于更新表单控件的主题相同。所以如果你有'东西'要做 - 就像加密/解密文件中的行 - 你需要在另一个带回调的线程上执行这些项目,否则表单显示不会更新,直到完成你的事情为止。您可以从工作线程内部引发事件 - 并使用主(表单)线程上的事件处理程序捕获它们以更新进度条。
答案 2 :(得分:0)
似乎您的UI线程被阻止,在Windows窗体编程中您有一个消息泵,而当您的主线程(UI)正在做其他事情时,它必须等待它才能处理消息。您可以通过设置后台工作程序来发送更新来解决此问题
有关UI线程和消息泵的更多信息,请参阅
http://www.codeproject.com/Articles/10311/What-s-up-with-BeginInvoke
有关backgroundworker线程的信息,请参阅此
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
小示例代码
// This event handler is where the time-consuming work is done.
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 1; i <= 10; i++)
{
if (worker.CancellationPending == true)
{
e.Cancel = true;
break;
}
else
{
// Perform a time consuming operation and report progress.
System.Threading.Thread.Sleep(500);
worker.ReportProgress(i * 10);
}
}
}