c#wpf中函数中的后台工作程序
我用C#wpf制作了一个简单的gui(很抱歉,我不能显示gui,因为我的声誉低于10) 它由richtextbox和一些其他控件组成。嗯。。。此应用程序将读取一个文件,然后在使用后台工作程序读取文件时,逐行向richtextbox显示文件内容。读取文件的函数如下所示:c#wpf中函数中的后台工作程序,c#,backgroundworker,C#,Backgroundworker,我用C#wpf制作了一个简单的gui(很抱歉,我不能显示gui,因为我的声誉低于10) 它由richtextbox和一些其他控件组成。嗯。。。此应用程序将读取一个文件,然后在使用后台工作程序读取文件时,逐行向richtextbox显示文件内容。读取文件的函数如下所示: public int parse_persoFile2(string fname, BackgroundWorker worker, DoWorkEventArgs e) { if (fname =
public int parse_persoFile2(string fname, BackgroundWorker worker, DoWorkEventArgs e)
{
if (fname == null) return -1;
System.IO.StreamReader ifs;
ifs = new System.IO.StreamReader(fname);
int max = (int)e.Argument;
int p = 0;
while (ifs.Peek() != -1)
{
string tempData = ifs.ReadLine();
if (tempData.Contains("CMD=5107") || tempData.Contains("CMD=5106") || tempData.Contains("CMD=5102"))
{
//field.AppendText(tempData.Remove(tempData.LastIndexOf('\\')).Remove(0, 4) + "\r\n");
//field.AppendText("--------\r\n");
//System.Threading.Thread.Sleep(500);
string data = tempData.Remove(tempData.LastIndexOf('\\')).Remove(0, 4) + "\r\n";
worker.ReportProgress(p, data);
}
p++;
}
worker.ReportProgress(100);
return 0;
}
private void doWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker wrk = sender as BackgroundWorker;
parser.parse_persoFile2(fileName, wrk, e);
}
private void proggChanged(object sender, ProgressChangedEventArgs e)
{
if(e.UserState != null)
mRTB.AppendText(e.UserState.ToString());
}
private void completed(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Ok....");
}
如我们所见,我在这个函数中使用backgroundworker从文件中读取字符串,然后将该字符串发送到reportprogress,以便在richtextbox中显示。请注意,persoFile2函数是由程序中的另一个对象生成的…:-)
接下来,我完成了doWork函数、worker\u progressChanged和worker\u RunWorker,以使backroundWorker正确工作。这些代码如下所示:
public int parse_persoFile2(string fname, BackgroundWorker worker, DoWorkEventArgs e)
{
if (fname == null) return -1;
System.IO.StreamReader ifs;
ifs = new System.IO.StreamReader(fname);
int max = (int)e.Argument;
int p = 0;
while (ifs.Peek() != -1)
{
string tempData = ifs.ReadLine();
if (tempData.Contains("CMD=5107") || tempData.Contains("CMD=5106") || tempData.Contains("CMD=5102"))
{
//field.AppendText(tempData.Remove(tempData.LastIndexOf('\\')).Remove(0, 4) + "\r\n");
//field.AppendText("--------\r\n");
//System.Threading.Thread.Sleep(500);
string data = tempData.Remove(tempData.LastIndexOf('\\')).Remove(0, 4) + "\r\n";
worker.ReportProgress(p, data);
}
p++;
}
worker.ReportProgress(100);
return 0;
}
private void doWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker wrk = sender as BackgroundWorker;
parser.parse_persoFile2(fileName, wrk, e);
}
private void proggChanged(object sender, ProgressChangedEventArgs e)
{
if(e.UserState != null)
mRTB.AppendText(e.UserState.ToString());
}
private void completed(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Ok....");
}
嗯。。。。当我运行这个程序时,我的richtextbox看起来不是逐行打印文件中的字符串,但它只在末尾打印一次…:-3.不,这才是我真正的问题。我读过这篇文章,但仍然不知道3如果调用
ReportProgress
方法太快,则在BackgroundWorker
再次点击之前,UI线程可能没有机会处理“进度”并进行适当更新
private void doWork(object sender, DoWorkEventArgs e)
{
var wrk = sender as BackgroundWorker;
// obviously you wouldn't really do this :)
while(true)
wrk.ReportProgress(0);
}
要查看您期望的效果,您可以在DoWork
事件中设置一个人工“暂停”,以便给UI适当更新的时间:
private void doWork(object sender, DoWorkEventArgs e)
{
var wrk = sender as BackgroundWorker;
var p = 0;
while(true)
{
wrk.ReportProgress(p++);
Thread.Sleep(100);
}
}
至于您的情况,如果代码执行得那么快,您实际上可能不需要在单独的线程中执行它
或者,您可以将UI更新为“Please wait.Loading…”,然后在
BackgroundWorker
中执行所有需要执行的操作,最后将最终结果返回UI。我建议您使用dispatcher.beginInvoke()而不是BackgroundWorkerWaaw。。。。我添加了System.Threading.Thread.Sleep(50);你说得对,格兰特先生。非常感谢……;-)哦。。。我从来没有尝试过C中的dispatcher,Jadavparesh先生,我还是个新手,但非常感谢你的建议…:-)是 啊“你说得对,格兰特先生,”我在我的while循环中添加了thread.sleep(50)。所以我现在可以看到报告的进展。嗯。。。关于“请稍候,加载…”,我认为这也是一个好主意,但如果我能看到backgroundworker一行一行地更新richTextBox,我会感到很高兴。呵呵…:-)谢谢你的回答格兰特先生…:-)