哪位好心的大哥帮我解决一下多线程文件操作的问题,附代码。
private void bnCopyFilesSecret_Click(object sender, EventArgs e)
{
DialogResult drResult = fbdOpenFolder.ShowDialog();
if (drResult == DialogResult.OK)
{
foreach (DataGridViewRow dgvSelectedRow in dgvSecretResults.SelectedRows)
{
alArrayPath.Add(dgvSelectedRow.Cells[2].Value);
alArrayName.Add(dgvSelectedRow.Cells[1].Value);
}
Thread tdThread = new Thread(new ThreadStart(fnCopyFiles));
tdThread.ApartmentState = ApartmentState.STA;
tdThread.Start();
}
}
private void fnCopyFiles()
{
fnCopyFilesExe(alArrayPath, alArrayName);
}
public void fnCopyFilesExe(ArrayList alPath, ArrayList alName)
{
MessageBox.Show(Convert.ToString(alPath.Count-1));
for (int i = 0; i < alPath.Count-1; i++)
{
if (File.Exists(alPath[i].ToString().Remove(0, 5)))
{
try
{
File.Copy(alPath[i].ToString().Remove(0, 5), fbdOpenFolder.SelectedPath + "\\ " + alName[i].ToString());
}
catch
{
//异常有待处理
}
fnSetLabelText( "正在复制: " + alName[i].ToString());
}
}
MessageBox.Show( "复制成功! ");
}
private void fnSetLabelText(string szLabelTextShow)
{
if (this.lbProcessInfoSecret.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(fnSetLabelText);
this.Invoke(d, new object[] { szLabelTextShow });
}
else
{
lbProcessInfoSecret.Text = szLabelTextShow;
}
}
delegate void SetTextCallback(string szLabelTextShow);
想实现的功能就是在DataGridView中选定多行后点击复制按钮,开启新线程,将文件保存到指定文件夹,同时通过invoke在UI层的Lable里显示正在复制。。。某某文件,运行代码报错:if (File.Exists(alPath[i].ToString().Remove(0, 5)))这句未将对象引用到实例。不解,小弟初学C#,啥都不会,请高手指教。
[解决办法]
MessageBox.Show(Convert.ToString(alPath.Count-1));
去掉线程代码中的试一下
[解决办法]
if (File.Exists(alPath[i].ToString().Remove(0, 5)))这句未将对象引用到实例
-----------------------------------
对alPath[i]的问题,比较蹊跷,单步调试下看alPath[i]到底什么问题!
[解决办法]
但是MessageBox.Show(Convert.ToString(alPath.Count-1));这一条能正确读出记录条数500条啊。
____________________________________________________
你如果在alPath里边存放500个null ,也能读出记录条数500条.