//如果用户先请求浏览一个目录,等一下又请求浏览另外的目录,那怎么操作?
        public Task <IEnumerable <Item> > GetDirChildren(DirItem dir, TaskCompletionSource <ConversationMessage> response = null)
        {
            if (dir.Equals(CurrentDir) && _listResult != null)
            {
                return(_listResult.Task);                //如果已经请求过了,而且两次请求的内容相同,就等待上次返回结果。
            }
            //表示别人请求过。让上一次的请求返回null。
            _listResult?.TrySetResult(null);

            CurrentDir  = dir;
            _listResult = new TaskCompletionSource <IEnumerable <Item> >();
            _listResult.SetValueWhenTimeout(TimeSpan.FromSeconds(Consts.DefaultConnectTimeoutSeconds), null);
            _currentRequest = new BrowseRequestMessage {
                DirItemId = dir.Id
            };
            //Env.Logger.Log($"Post Message {_currentRequest}", nameof(RemoteBrowser));
            var postTask = _conversation.PostMessage(_currentRequest);

            postTask.ConfigureAwait(false);
            if (postTask.Result)
            {
                return(_listResult.Task);
            }

            _listResult.TrySetResult(null);
            response?.TrySetResult(null);
            return(_listResult.Task);
        }
Example #2
0
        public Task <IEnumerable <Item> > GetDirChildren(DirItem dir)
        {
            CurrentDir = dir;
            //为上一次的GetItems请求返回null。
            _getItemsTcs?.TrySetResult(null);

            _getItemsTcs = new TaskCompletionSource <IEnumerable <Item> >();
            _getItemsTcs.SetValueWhenTimeout(TimeSpan.FromSeconds(DefaultConnectTimeoutSeconds), null);

            Task.Run(() =>
            {
                var ch = dir.Children;
                _getItemsTcs.SetResult(ch);
            });
            return(_getItemsTcs.Task);
        }
Example #3
0
        /// <summary>
        ///创建之后还需要start,是因为创建之后还有很多准备工作要做,比如说要发什么文件,要浏览什么目录。
        /// </summary>
        /// <returns>返回ConversationMessage,是因为可以返回有意义的结果,比如说拒绝了,为什么拒绝?比如说同意了浏览了,可以直接把文件列表发过来。</returns>
        public Task <ConversationMessage> Start()
        {
            //取消上一次的调用结果。
            Response?.TrySetResult(new ConversationCancelledMessage());

            Response = new TaskCompletionSource <ConversationMessage>();
            Response.SetValueWhenTimeout(TimeSpan.FromSeconds(Consts.DefaultConnectTimeoutSeconds), new ConversationTimeoutMessage());
            SuperDriveCore.AttachConversation(this);
            State = RequesterState.Attached;

            if (IsAutoRecoverable)
            {
                Peer.AddAutoConnectRequester(this);
            }
            State = RequesterState.Requesting;
            OnInitRequest();
            return(Response.Task);
        }