作者kairy (血腹兽)
看板C_Sharp
标题[问题] 关於BackgroundWorker的行为中有大量档案IO
时间Mon Jun 14 14:48:03 2010
大家好
我在WPF的程式之中,有读取大量的xaml档案
所以我将读取xaml的部份放在BackgroudWorker的DoWork
void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
// 预备储存读进来的string
List<string> ContentList = new List<string>();
// 准备被读的档案路径的集合,每个档案约200-300k, 每次约读50-500个档
List<string> fileList = e.Argument as List<string>;
foreach (string filePath in fileList)
{
string content = "";
FileInfo info = new FileInfo(filePath);
using (FileStream stream = info.OpenRead())
{
StreamReader reader = new StreamReader(stream);
content = reader.ReadToEnd();
}
ContentList.Add(content);
}
e.Result = ContentList;
}
本来这段程式码交给BackgroundWorker的原因是想保持WPF视窗的互动性
但是现在DoWork在执行的时候
视窗也没有回应,反应和没有使用BackgroundWorker是差不多的
想请教各位板友应该怎麽处理
谢谢大家耐心看完
补充啓动BackgroundWorker那段
// 某个按钮的触发事件
private void ShowSelectedImage_Click(object sender, RoutedEventArgs e)
{
// SelectionListView是combobox
if (SelectionListView.SelectedItems.Count == 0)
{
MessageBox.Show("请勾选比对结果")
return;
}
// 先把状态都清光光,这段可以忽略
compare1.Children.Clear();
compare2.Children.Clear();
imageCollection.Clear();
AllUnChecked(compare1ChkFields);
AllUnChecked(compare2ChkFields);
// 取得在ListView中勾选的时间
List<DateTime> cDateList = new List<DateTime>();
cDateList = new List<DateTime>();
foreach (DataRowView item in SelectionListView.SelectedItems)
{
cDateList.Add(Convert.ToDateTime(item["CDate"]));
}
foreach (DateTime cDate in cDateList)
{
// compare1
ShowImage image = new ShowImage("XamlDiagram\\iswis-map.xaml");
image.OverLap(domainSelected.GetMapFrameXaml());
image.SetText(cDate.ToString());
image.Info = goalImage.Info;
compare1.Children.Add(image);
imageCollection.Add(image);
// compare2
ShowImage image2 = new ShowImage("XamlDiagram\\iswis-map.xaml");
image2.OverLap(domainSelected.GetMapFrameXaml());
image2.SetText(cDate.ToString());
image2.Info = goalImage.Info;
compare2.Children.Add(image2);
imageCollection.Add(image2);
}
// 从这以下一大段是从介面上使用者选取的状态去找出要喂给BackgroundWorker的
// 路径集合
string historyModelName = sourceHistory.SelectedItem.ToString();
List<string> buttonContentList = new List<string>();
foreach (ShowImageButton button in compare1ChkFields.Children)
{
buttonContentList.Add(button.Content.ToString());
}
// 要喂给BackgroundWorker的档案路径集合
List<string> fileList = new List<string>();
foreach (DateTime cDate in cDateList)
{
foreach (string buttonContent in buttonContentList)
{
string fileName = Properties.Resources.HISTORY_XAML_PATH
+ "\\" + historyModelName + "\\" + cDate.ToString("yyyy") + "\\" +
cDate.ToString("HH") + "\\" + historyModelName + "_" +
cDate.ToString("yyyyMMddHHmm") + "_000_" + buttonContent + ".xaml";
fileList.Add(fileName);
}
}
// 这行我自己测试用
MessageBox.Show("开始读取资料");
// 啓动BackgroundWorker
backgroundWorker.RunWorkerAsync(fileList);
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.231.43.58
1F:→ optimist9266:可以让我看启动BGW的那段程式码吗? 06/14 14:50
2F:→ kairy:我整理一下贴上来,可是会很乱~~我尽量说明清楚 06/14 14:53
※ 编辑: kairy 来自: 118.231.43.58 (06/14 15:03)
3F:→ suny999:可以看RunWorkerCompleted程式码吗?方便连~completed也贴 06/14 22:53
4F:→ suny999:打错了,是ProgressChanged那段 06/14 22:54