繁体   English   中英

如何多次向后台工作人员报告进度?

[英]How can i reportprogress to a backgroundworker multiple times?

我创建了一个小班

public class MyProgress
        {
            public string Report1 { get; set; }
            public string Report2 { get; set; }
        }

然后在一种方法中,我想实时报告每个文件名:

private void DirSearch(string root, string filesExtension,string textToSearch)
        {
            List<MyProgress> prog = new List<MyProgress>();
            string[] filePaths = Directory.GetFiles(root, filesExtension, SearchOption.AllDirectories);
            for (int i = 0; i < filePaths.Length; i++)
            {
                int var = File.ReadAllText(filePaths[i]).Contains(textToSearch) ? 1 : 0;
                if (var == 1)
                {
                    string filename = filePaths[i];
                    prog.Add(new MyProgress { Report1 = filename });
                }
            }
            backgroundWorker1.ReportProgress(0, prog);
        }

不确定ReportProgress是应该在FOR循环之外还是在prog.Add行之后。

然后在进度变化事件中

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    foreach (p in (e.UserState as List<MyProgress>))
    {
        Console.WriteLine("Progress for {0} is {1}", p.);
    }              
}

我在foreach中遇到错误,我不确定变量'p'应该是哪种类型

我试过了:

foreach (List<MyProgress> p in (e.UserState as List<MyProgress>))

但是出现错误:

错误8无法将类型'Search_Text_In_Files.Form1.MyProgress'转换为'System.Collections.Generic.List'

OP完全改变了问题
你不知道p应该是什么?
提示您正在枚举MyProgress列表

foreach (var p in (e.UserState as List<MyProgress>))

但是你传递一个字符串

backgroundWorker1.ReportProgress(0, filename);

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    Console.WriteLine(e.UserState.ToString());           
}

这是工作的典型标志
即使DirSearch是工作方法,您也应该将BackgroundWorker传递给它IMHO
并且您应该将结果作为.Result-prog传递出去

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {   
        // Get the BackgroundWorker that raised this event.
        BackgroundWorker worker = sender as BackgroundWorker;

        // Assign the result of the computation
        // to the Result property of the DoWorkEventArgs
        // object. This is will be available to the 
        // RunWorkerCompleted eventhandler.
        e.Result = ComputeFibonacci((int)e.Argument, worker, e);
    }

不知道ReportProgress是应该在FOR循环之外还是在编之后

您想从正在进行工作的for循环内部报告进度。 如果在一次调用ReportProgress的过程中传递了进度报告列表,则在处理结束时将仅调用一次backgroundWorker1_ProgressChanged。 完成所有工作后,您的所有进度报告可能会立即发送。

您当前的代码将报告进度,并尝试在完成所有操作后再次报告。 您将不同的数据类型传递到相同的进度报告处理程序中,即stringList<MyProgress>

for (int i = 0; i < filePaths.Length; i++)
{
    int var = File.ReadAllText(filePaths[i]).Contains(textToSearch) ? 1 : 0;
    if (var == 1)
    {
        string filename = filePaths[i];
        backgroundWorker1.ReportProgress(0, filename);
    }
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    Console.WriteLine("Progress for {0} is {1}", e.UserState);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM