首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

哪位好心的大哥帮小弟我解决一下多线程文件操作的有关问题,附代码。(2)

2012-02-03 
哪位好心的大哥帮我解决一下多线程文件操作的问题,附代码。(2)还是上午的那个问题,后来变了一下不行了。但那

哪位好心的大哥帮我解决一下多线程文件操作的问题,附代码。(2)
还是上午的那个问题,后来变了一下不行了。但那个问题已经结帖了,所以重发一贴请教。本人初学C#,比较菜,往高手多多指点:
上个问题就不贴了,地址在http://community.csdn.net/Expert/TopicView3.asp?id=5633807
现在改成:
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()
                {
                        CFileOperation.fnCopyFiles(alArrayPath,   alArrayName,fbdOpenFolder.SelectedPath,lbProcessInfoSecret);

                }
将下面那些代码封装成了一个CFileOperate类,结构如下:
public   void   fnCopyFiles(ArrayList   alPath,   ArrayList   alName,   string   szDestinationPath,   Label   lbLabelProcessShow)
                {

                        for   (int   i   =   0;   i   <   alPath.Count;   i++)
                        {
                                if   (alPath[i]   !=   null)
                                {
                                        if   (File.Exists(alPath[i].ToString().Remove(0,   5)))


                                        {
                                                try
                                                {
                                                        File.Copy(alPath[i].ToString().Remove(0,   5),   szDestinationPath   +   "\\ "   +   alName[i].ToString());
                                                }
                                                catch
                                                {
                                                        //异常有待处理
                                                }
                                                fnSetLabelText(lbLabelProcessShow,   "正在复制: "   +   alName[i].ToString());

                                        }
                                }
                        }
                        MessageBox.Show( "复制成功! ");
                       
                }
                private   void   fnSetLabelText(Label   lbLabelProcessShow,   string   szLabelTextShow)
                {
                        if   (lbLabelProcessShow.InvokeRequired)
                        {
                                dSetTextCallback   dInsertWords   =   new   dSetTextCallback(fnSetLabelText);
                                lbLabelProcessShow.Invoke(dInsertWords,   new   object[]   {   szLabelTextShow   });
                               


                        }
                        else
                        {
                                lbLabelProcessShow.Text   =   szLabelTextShow;
                        }
                }
                delegate   void   dSetTextCallback(Label   lbLabelProcessShow,   string   szLabelTextShow);
主要就是改的这里:
if   (lbLabelProcessShow.InvokeRequired)
                        {
                                dSetTextCallback   dInsertWords   =   new   dSetTextCallback(fnSetLabelText);
                                lbLabelProcessShow.Invoke(dInsertWords,   new   object[]   {   szLabelTextShow   });
                               
                        }
前面是用的this,但是控件传到这边来用就不行了。关于这块我不是太熟,希望大哥们讲讲这种消息的机制,再帮我修改下程序。

[解决办法]
lbLabelProcessShow.Invoke(dInsertWords, new object[] { szLabelTextShow });

该成:

lbLabelProcessShow.Invoke(dInsertWords, new object[] { lbLabelProcessShow, szLabelTextShow });

热点排行