/// <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); }
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); } }
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) { } }