internal IAsyncResult BeginExecute(int timeout, string path, AsyncCallback cb, object state) { List_SO stateObj = null; SetProgress(true); try { CreateDTP(); stateObj = new List_SO(new DTPStreamCommon(Stream.Null, DTPStreamType.ForWriting), cb, state); _linesBuilder.NewLineEvent += new LinesBuilder.NewLineEventHandler(List_OnNewLineEvent); _items.Clear(); _linesBuilder.Reset(); string cmd = "LIST"; if (null != path) { cmd += " " + path; } _currentDTP.DataTransfered += new Cmd_RunDTP.DataTransferedEventHandler(List_OnDataTransfered); try { _currentDTP.BeginExecute(timeout, cmd, FtpDataType.Ascii, -1, stateObj.UserStream, new AsyncCallback(RunCmd_End), stateObj); } catch (Exception e) { _currentDTP.DataTransfered -= new Cmd_RunDTP.DataTransferedEventHandler(List_OnDataTransfered); throw e; } } catch (Exception e) { if (null != _currentDTP) { _currentDTP.Dispose(); _currentDTP = null; } SetProgress(false); throw e; } return(stateObj); }
void RunCmd_End(IAsyncResult ar) { List_SO stateObj = (List_SO)ar.AsyncState; try { stateObj.UpdateContext(); _currentDTP.EndExecute(ar); } catch (Exception e) { stateObj.Exception = e; } finally { _currentDTP.DataTransfered -= new Cmd_RunDTP.DataTransferedEventHandler(List_OnDataTransfered); _currentDTP.Dispose(); _currentDTP = null; _linesBuilder.NewLineEvent -= new LinesBuilder.NewLineEventHandler(List_OnNewLineEvent); stateObj.SetCompleted(); } }