日期:2014-05-18  浏览次数:20913 次

救一backgroundworker的例子,实例在backgroundwoker中的数据转入listview中显示。详细请见:
求一用backgroundwoker与listview做开发的例子,情况是:
用backgroundworker从指定目录下读取大批量的文件信息,然后在listview中把这些信息一行一行的显示出来。但在开发时出现了载入文件信息到listview中时会有多行信息是一样的情况。但后在读取文件的主体过程InvokeFun(BackgroundWorker worker, DoWorkEventArgs e) 中通过worker.ReportProgress(百分比变量,e.userstate(这是要载入到listview某行的当前文件信息字串)),以及backgroundWorker1_ProgressChanged()中分解e.userstate.tostring()得到的文件信息字串项来完成文件信息的listview载入。

虽然现在是实例了,但是觉得这样不好。所以想求一例子好让我学习一下如何在这种情况中完成线程之间的参数传递,即不用文件信息字串的方式通过e.userstate传给backgroundWorker1_ProgressChanged()来分解处理。多谢。部分代码如下:

[代码1]
private void InvokeFun(BackgroundWorker worker, DoWorkEventArgs e) 
{
  ....省去处理过程

  //这就是要把文件的信息通过arrLSInfo数组字串连接后转给backgroundWorker1_ProgressChanged()
  worker.ReportProgress(intPrg, arrLSInfo[0] + " ̄" + arrLSInfo[1]
  + " ̄" + arrLSInfo[2] + " ̄" + arrLSInfo[3] + " ̄" + arrLSInfo[4]
  + " ̄" + arrLSInfo[5] + " ̄" + arrLSInfo[6]);  
}


[代码2]
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
  int intNum = 0;
  string[] arrInfo = new string[7];
  string strRes = e.UserState.ToString()+" ̄";
  int i = 0;
  int intPos = 0;
   
  while (strRes.IndexOf(" ̄")>-1)
  {
  intPos = strRes.IndexOf(" ̄");

  arrInfo[i] = strRes.Substring(0,intPos);

  strRes = strRes.Substring(intPos+1);

  i+=1;
  }
  //得到当前序号
  intNum = Convert.ToInt32(arrInfo[5]);

  spbLoading.Value = e.ProgressPercentage;

  tsslLoad.Text = arrInfo[5] + "/" + c_intSubTaskFilesNum.ToString();

  ////刷新listview控件
  ListViewItem listViewItem = new ListViewItem(new string[] {
  arrInfo[5],
  arrInfo[6],
  arrInfo[1],
  arrInfo[3],
  arrInfo[2]
  });
  lvInfo.Items.Add(listViewItem);

  //重新设定背景颜色
  if ((intNum % 2) == 1)
  lvInfo.Items[intNum - 1].BackColor = Color.WhiteSmoke;

}




------解决方案--------------------
不懂为什么不能把arrLSInfo一次性通过UserState传进来。UserState是object类型,可以传递任何类型的参数。另外使用string[]类型的Array似乎看得出lz是从C语言之类转过来的吧。