现在的位置: 首页 > 综合 > 正文

线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法!

2012年09月24日 ⁄ 综合 ⁄ 共 4869字 ⁄ 字号 评论关闭

#region 委派及相关方法
       
        private delegate void SetBoolDelegate(bool formOnTop);
        private void SetBoolFlag(SetBoolDelegate myDelegate, bool flag)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(myDelegate, flag);
            }
            else
            {
                myDelegate(flag);
            }
        }
        /// <summary>
        /// 窗口浮动于顶层
        /// </summary>
        ///<param name="flag">是否浮动于最上层</param>
        private void FormOnTop(bool flag)
        {
            this.TopMost = flag;
        }
       
        private delegate void SetStrDelegate(string text);
        private void SetText(SetStrDelegate myDelegate, string text)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(myDelegate, text);
            }
            else
            {
                myDelegate(text);
            }
        }
        /// <summary>
        /// 更新提示信息
        /// </summary>
        /// <param name="text">信息内容</param>
        private void UpdateInfoLabel(string text)
        {
            this.labStatusMessage.Text = text;
        }

        /// <summary>
        /// 更新当前目录信息
        /// </summary>
        /// <param name="path"></param>
        private delegate void UpdateListDelegate(string path);

        /// <summary>
        /// 更新列表(列出当前目录下的目录和文件)
        /// </summary>
        /// <param name="newPath">路径</param>
        private void UpdateList(string newPath)
        {
            if (newPath == "")
            {
                ListDrivers();
            }
            else
            {
                try
                {
                    DirectoryInfo currentDir = new DirectoryInfo(newPath);
                    DirectoryInfo[] dirs = currentDir.GetDirectories(); //获取目录
                    FileInfo[] files = currentDir.GetFiles();   //获取文件
                    //删除ImageList中的程序图标
                    foreach (ListViewItem item in listViewContent.Items)
                    {
                        if (item.Text.EndsWith(".exe"))  //是程序
                        {
                            imageListSmall.Images.RemoveByKey(item.Text);
                            imageListLarge.Images.RemoveByKey(item.Text);
                        }
                    }
                    listViewContent.Items.Clear();
                    //列出文件夹
                    foreach (DirectoryInfo dir in dirs)
                    {
                        ListViewItem dirItem = listViewContent.Items.Add(dir.Name, 2);
                        dirItem.Name = dir.FullName;
                        dirItem.SubItems.Add("");
                        dirItem.SubItems.Add("文件夹");
                        dirItem.SubItems.Add(dir.LastWriteTimeUtc.ToString());
                    }
                    //列出文件
                    foreach (FileInfo file in files)
                    {
                        ListViewItem fileItem = listViewContent.Items.Add(file.Name);
                        if (file.Extension == ".exe" || file.Extension == "")   //程序文件或无扩展名
                        {
                            Icon fileIcon = GetSystemIcon.GetIconByFileName(file.FullName);
                            imageListSmall.Images.Add(file.Name, fileIcon);
                            imageListLarge.Images.Add(file.Name, fileIcon);
                            fileItem.ImageKey = file.Name;
                        }
                        else    //其它文件
                        {
                            if (!imageListSmall.Images.ContainsKey(file.Extension))  //ImageList中不存在此类图标
                            {
                                Icon fileIcon = GetSystemIcon.GetIconByFileName(file.FullName);
                                imageListSmall.Images.Add(file.Extension, fileIcon);
                                imageListLarge.Images.Add(file.Extension, fileIcon);
                            }
                            fileItem.ImageKey = file.Extension;
                        }
                        fileItem.Name = file.FullName;
                        fileItem.SubItems.Add(file.Length.ToString() + "字节");
                        fileItem.SubItems.Add(file.Extension);
                        fileItem.SubItems.Add(file.LastWriteTimeUtc.ToString());
                    }
                    CurrentPath = newPath;
                    tspCboxPath.Text = CurrentPath;   //更新地址栏
                    labStatusStatistics.Text = listViewContent.Items.Count + "个对象";     //更新状态栏
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }

         delegate string GetStrDelegate();

         private string GetText(GetStrDelegate myDelegate)
        {
            if (this.InvokeRequired)
            {
                return (string)this.Invoke(myDelegate);
            }
            else
            {
                return myDelegate();
            }
        }
        #endregion 

 

使用:

this.SetBoolFlag(FormOnTop, false);

this.SetText(UpdateInfoLabel, "文件已经被粉碎!");

string strUri = this.GetText(GetComboBoxWebText);

或者:(当方法比较复杂的时候)

Invoke(new UpdateListDelegate(UpdateList), CurrentDirectoryName);

抱歉!评论已关闭.