c#wpf中函数中的后台工作程序

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 =

我用C#wpf制作了一个简单的gui(很抱歉,我不能显示gui,因为我的声誉低于10)

它由richtextbox和一些其他控件组成。嗯。。。此应用程序将读取一个文件,然后在使用后台工作程序读取文件时,逐行向richtextbox显示文件内容。读取文件的函数如下所示:

    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,我会感到很高兴。呵呵…:-)谢谢你的回答格兰特先生…:-)