Example #1
0
        /// <summary>
        /// 重置一个节点
        /// </summary>
        /// <param name="tn"></param>
        /// <param name="acbCallback"></param>
        /// <param name="state"></param>
        private void ReLoadNode(TreeNode tn, AsyncCallback acbCallback = null, object state = null)
        {
            FileType ft    = FileType.磁盘;
            var      mytag = tn.Tag as myNodeTag;

            if (mytag != null)
            {
                ft = mytag.FileType;
            }
            var parent = tn.Parent;
            var idx    = tn.Index;

            tn.Remove();
            tn.Nodes.Clear();
            if (acbCallback == null)
            {
                state       = tn;
                acbCallback = ar =>
                {
                    if (parent == null)
                    {
                        SetNodeIdx(tn, 3);
                    }
                    else
                    {
                        AddChildNode(parent, tn, ft == FileType.文件, idx);
                    }
                };
            }
            if (ft == FileType.文件)
            {
                var fi = ((tn.Tag as myNodeTag).Tag as FileInfo);
                fi.Refresh();
                if (!fi.Exists)
                {
                    ReLoadNode(parent);//不存在就刷新父节点
                    return;
                }
                AddChildNode(parent, tn, ft == FileType.文件, idx);
                return;
            }
            GetInDirectoryFiles handler = new GetInDirectoryFiles(GetInDirectoryFiles);
            IAsyncResult        result  = handler.BeginInvoke(tn, acbCallback, state);
        }
Example #2
0
        private async void 加载子节点(List <TreeNode> tns, bool 使用ui线程 = false)
        {
            GetInDirectoryFiles handler = new GetInDirectoryFiles(GetInDirectoryFiles);

            //IAsyncResult: 异步操作接口(interface)
            //BeginInvoke: 委托(delegate)的一个异步方法的开始
            //                                        委托参数,回调函数,回调函数中的result.AsyncState对象

            if (!使用ui线程)
            {
                handler.BeginInvoke(tns[0], new AsyncCallback(异步回调函数), tns); //后台线程异步
                return;
            }
            while (tns.Count > 0)
            {
                await GetInDirectoryFiles(tns[0]);//主线程上异步

                真回调函数(tns);
            }
        }
Example #3
0
 private void 异步回调函数(IAsyncResult result)
 {
     try
     {
         //result 是委托方法的返回值
         //AsyncResult 是IAsyncResult接口的一个实现类,空间:System.Runtime.Remoting.Messaging
         //AsyncDelegate 属性可以强制转换为用户定义的委托的实际类。
         GetInDirectoryFiles handler = null;
         if (result != null)
         {
             handler = (GetInDirectoryFiles)((AsyncResult)result).AsyncDelegate;
             handler.EndInvoke(result).Wait();
         }
         // Console.WriteLine(result.AsyncState);
         var curNodes = (result.AsyncState as List <TreeNode>);
         真回调函数(curNodes);
         IAsyncResult result1 = handler.BeginInvoke(curNodes[0], new AsyncCallback(异步回调函数), curNodes);
     }
     catch (Exception)
     {
     }
 }