![](/img/trans.png)
[英]How can I report multiple reportprogress values from backgroundworker dowork event to a dataGridView?
[英]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。 完成所有工作后,您的所有进度报告可能会立即发送。
您当前的代码将报告进度,并尝试在完成所有操作后再次报告。 您将不同的数据类型传递到相同的进度报告处理程序中,即string
和List<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.