Пример #1
0
 /// <summary>
 /// Write instruction operands into bytecode stream.
 /// </summary>
 /// <param name="writer">Bytecode writer.</param>
 public override void WriteOperands(WordWriter writer)
 {
     Queue.Write(writer);
     NumEvents.Write(writer);
     WaitEvents.Write(writer);
     RetEvent.Write(writer);
 }
Пример #2
0
        void Wait(string taskID,
                  WaitEvents wait_events,
                  TimeSpan timeout,
                  CancellationToken cancellation_token)
        {
            DateTime start_time = DateTime.Now; // 其实可以不用

            WaitHandle[] events = null;

            if (cancellation_token != null)
            {
                events    = new WaitHandle[3];
                events[0] = wait_events.finish_event;
                events[1] = wait_events.active_event;
                events[2] = cancellation_token.WaitHandle;
            }
            else
            {
                events    = new WaitHandle[2];
                events[0] = wait_events.finish_event;
                events[1] = wait_events.active_event;
            }

            while (true)
            {
                int index = WaitHandle.WaitAny(events,
                                               timeout,
                                               true); // false

                if (index == 0)                       // 正常完成
                {
                    return;                           //  result;
                }
                else if (index == 1)
                {
                    start_time = DateTime.Now;  // 重新计算超时开始时刻
                    Debug.WriteLine("重新计算超时开始时间 " + start_time.ToString());
                }
                else if (index == 2)
                {
                    if (cancellation_token != null)
                    {
                        // 向服务器发送 CancelSearch 请求
                        CancelSearchAsync(taskID);
                        cancellation_token.ThrowIfCancellationRequested();
                    }
                }
                else if (index == WaitHandle.WaitTimeout)
                {
                    // if (DateTime.Now - start_time >= timeout)
                    {
                        Debug.WriteLine("超时。delta=" + (DateTime.Now - start_time).TotalSeconds.ToString());
                        // 向服务器发送 CancelSearch 请求
                        CancelSearchAsync(taskID);
                        throw new TimeoutException("已超时 " + timeout.ToString());
                    }
                }
            }
        }
        protected override void ConfigureNextAcquisitionCycle(JobAcquisitionContext context, IJobAcquisitionStrategy acquisitionStrategy)
        {
            base.ConfigureNextAcquisitionCycle(context, acquisitionStrategy);

            var timeBetweenCurrentAndNextAcquisition = acquisitionStrategy.WaitTime;

            WaitEvents.Add(new RecordedWaitEvent(DateTime.Now.Ticks, timeBetweenCurrentAndNextAcquisition));
        }
Пример #4
0
 Task WaitAsync(string taskID,
                WaitEvents wait_events,
                TimeSpan timeout,
                CancellationToken cancellation_token)
 {
     return(TaskRunAction(
                () =>
     {
         Wait(taskID, wait_events, timeout, cancellation_token);
     },
                cancellation_token));
 }
Пример #5
0
        /// <summary>
        /// Calculate number of words to fit complete instruction bytecode.
        /// </summary>
        /// <returns>Number of words in instruction bytecode.</returns>
        public override uint GetWordCount()
        {
            uint wordCount = 0;

            wordCount += IdResultType.GetWordCount();
            wordCount += IdResult.GetWordCount();
            wordCount += Queue.GetWordCount();
            wordCount += NumEvents.GetWordCount();
            wordCount += WaitEvents.GetWordCount();
            wordCount += RetEvent.GetWordCount();
            return(wordCount);
        }
Пример #6
0
 /// <summary>
 /// Write instruction operands into bytecode stream.
 /// </summary>
 /// <param name="writer">Bytecode writer.</param>
 public override void WriteOperands(WordWriter writer)
 {
     Queue.Write(writer);
     Flags.Write(writer);
     NDRange.Write(writer);
     NumEvents.Write(writer);
     WaitEvents.Write(writer);
     RetEvent.Write(writer);
     Invoke.Write(writer);
     Param.Write(writer);
     ParamSize.Write(writer);
     ParamAlign.Write(writer);
     LocalSize.Write(writer);
 }
Пример #7
0
        /// <summary>
        /// Calculate number of words to fit complete instruction bytecode.
        /// </summary>
        /// <returns>Number of words in instruction bytecode.</returns>
        public override uint GetWordCount()
        {
            uint wordCount = 0;

            wordCount += IdResultType.GetWordCount();
            wordCount += IdResult.GetWordCount();
            wordCount += Queue.GetWordCount();
            wordCount += Flags.GetWordCount();
            wordCount += NDRange.GetWordCount();
            wordCount += NumEvents.GetWordCount();
            wordCount += WaitEvents.GetWordCount();
            wordCount += RetEvent.GetWordCount();
            wordCount += Invoke.GetWordCount();
            wordCount += Param.GetWordCount();
            wordCount += ParamSize.GetWordCount();
            wordCount += ParamAlign.GetWordCount();
            wordCount += LocalSize.GetWordCount();
            return(wordCount);
        }
Пример #8
0
        public async Task <SetInfoResult> SetInfoAsyncLite(
            string strRemoteUserName,
            SetInfoRequest request,
            TimeSpan timeout,
            CancellationToken token)
        {
            SetInfoResult result = new SetInfoResult();

            if (result.Entities == null)
            {
                result.Entities = new List <Entity>();
            }

            if (string.IsNullOrEmpty(request.TaskID) == true)
            {
                request.TaskID = Guid.NewGuid().ToString();
            }

            using (WaitEvents wait_events = new WaitEvents())
            {
                using (var handler = HubProxy.On <
                           string, long, IList <Entity>, string>(
                           "responseSetInfo",
                           (taskID, resultValue, entities, errorInfo) =>
                {
                    if (taskID != request.TaskID)
                    {
                        return;
                    }

                    // 装载命中结果
                    if (entities != null)
                    {
                        result.Entities.AddRange(entities);
                    }
                    result.Value = resultValue;
                    result.ErrorInfo = errorInfo;
                    wait_events.finish_event.Set();
                }))
                {
                    MessageResult message = await HubProxy.Invoke <MessageResult>(
                        "RequestSetInfo",
                        strRemoteUserName,
                        request).ConfigureAwait(false);

                    if (message.Value == -1 ||
                        message.Value == 0)
                    {
                        result.ErrorInfo = message.ErrorInfo;
                        result.Value     = -1;
                        result.String    = message.String;
                        return(result);
                    }

                    await WaitAsync(
                        request.TaskID,
                        wait_events,
                        timeout,
                        token).ConfigureAwait(false);

                    return(result);
                }
            }
        }
Пример #9
0
        // 新版 API,测试中
        public async Task <SearchResult> SearchAsyncLite(
            string strRemoteUserName,
            SearchRequest request,
            TimeSpan timeout,
            CancellationToken token)
        {
            ResultManager manager = new ResultManager();
            List <string> errors  = new List <string>();
            List <string> codes   = new List <string>();

            SearchResult result = new SearchResult();

            if (result.Records == null)
            {
                result.Records = new List <Record>();
            }

            if (string.IsNullOrEmpty(request.TaskID) == true)
            {
                request.TaskID = Guid.NewGuid().ToString();
            }

            using (WaitEvents wait_events = new WaitEvents())    // 表示中途数据到来
            {
                using (var handler = HubProxy.On <SearchResponse>(
                           "responseSearch",
                           (responseParam) =>
                {
                    try
                    {
                        if (responseParam.TaskID != request.TaskID)
                        {
                            return;
                        }

                        // Debug.WriteLine("handler called. responseParam\r\n***\r\n" + responseParam.Dump() + "***\r\n");

                        // 装载命中结果
                        if (responseParam.ResultCount == -1 && responseParam.Start == -1)
                        {
                            if (result.ResultCount != -1)
                            {
                                result.ResultCount = manager.GetTotalCount();
                            }
                            //result.ErrorInfo = responseParam.ErrorInfo;
                            //result.ErrorCode = responseParam.ErrorCode;
                            result.ErrorInfo = StringUtil.MakePathList(errors, "; ");
                            result.ErrorCode = StringUtil.MakePathList(codes, ",");

                            Debug.WriteLine("finish_event.Set() 1");
                            wait_events.finish_event.Set();
                            return;
                        }

                        // TODO: 似乎应该关注 start 位置
                        if (responseParam.Records != null)
                        {
                            AddLibraryUID(responseParam.Records, responseParam.LibraryUID);
                        }

                        result.Records.AddRange(responseParam.Records);
                        if (string.IsNullOrEmpty(responseParam.ErrorInfo) == false &&
                            errors.IndexOf(responseParam.ErrorInfo) == -1)
                        {
                            errors.Add(responseParam.ErrorInfo);
                            result.ErrorInfo = StringUtil.MakePathList(errors, "; ");
                        }
                        if (string.IsNullOrEmpty(responseParam.ErrorCode) == false &&
                            codes.IndexOf(responseParam.ErrorCode) == -1)
                        {
                            codes.Add(responseParam.ErrorCode);
                            result.ErrorCode = StringUtil.MakePathList(codes, ",");
                        }

                        // 标记结束一个检索目标
                        // return:
                        //      0   尚未结束
                        //      1   结束
                        //      2   全部结束
                        int nRet = manager.CompleteTarget(responseParam.LibraryUID,
                                                          responseParam.ResultCount,
                                                          responseParam.Records == null ? 0 : responseParam.Records.Count);

                        if (responseParam.ResultCount == -1)
                        {
                            result.ResultCount = -1;
                        }
                        else
                        {
                            result.ResultCount = manager.GetTotalCount();
                        }

#if NO
                        if (nRet == 2)
                        {
                            Debug.WriteLine("finish_event.Set() 2");
                            wait_events.finish_event.Set();
                        }
                        else
                        {
                            wait_events.active_event.Set();
                        }
#endif
                        wait_events.active_event.Set();
                    }
                    catch (Exception ex)
                    {
                        errors.Add("SearchAsync handler 内出现异常: " + ExceptionUtil.GetDebugText(ex));
                        result.ErrorInfo = StringUtil.MakePathList(errors, "; ");
                        if (!(ex is ObjectDisposedException))
                        {
                            wait_events.finish_event.Set();
                        }
                    }
                }))
                {
                    MessageResult message = await HubProxy.Invoke <MessageResult>(
                        "RequestSearch",
                        strRemoteUserName,
                        request).ConfigureAwait(false);

                    if (message.Value == -1 || message.Value == 0)
                    {
                        result.ErrorInfo   = message.ErrorInfo;
                        result.ResultCount = -1;
                        result.ErrorCode   = message.String;
                        Debug.WriteLine("return pos 1");
                        return(result);
                    }

                    if (manager.SetTargetCount(message.Value) == true)
                    {
                        Debug.WriteLine("return pos 2");
                        return(result);
                    }

                    try
                    {
                        // TODO: 当检索一个目标的时候,不应该长时间等待其他目标
                        await WaitAsync(
                            request.TaskID,
                            wait_events,
                            timeout,
                            token).ConfigureAwait(false);
                    }
                    catch (TimeoutException)
                    {
                        // 超时的时候实际上有结果了
                        if (result.Records != null &&
                            result.Records.Count > 0)
                        {
                            result.ErrorCode += ",_timeout";    // 附加一个错误码,表示虽然返回了结果,但是已经超时
                            Debug.WriteLine("return pos 3");
                            return(result);
                        }
                        throw;
                    }

                    Debug.WriteLine("return pos 4");
                    return(result);
                }
            }
        }
Пример #10
0
        public async Task <MessageResult> GetMessageAsyncLite(
            GetMessageRequest request,
            Delegate_outputMessage proc,
            TimeSpan timeout,
            CancellationToken token)
        {
            MessageResult result = new MessageResult();

            if (string.IsNullOrEmpty(request.TaskID) == true)
            {
                request.TaskID = Guid.NewGuid().ToString();
            }

            long recieved = 0;

            StringBuilder cache = new StringBuilder();

            using (WaitEvents wait_events = new WaitEvents())    // 表示中途数据到来
            {
                using (var handler = HubProxy.On <
                           string, long, long, IList <MessageRecord>, string, string>(
                           "responseGetMessage",
                           (taskID, resultCount, start, records, errorInfo, errorCode) =>
                {
                    if (taskID != request.TaskID)
                    {
                        return;
                    }

                    if (resultCount == -1 || start == -1)
                    {
                        if (start == -1)
                        {
                            // 表示发送响应过程已经结束。只是起到通知的作用,不携带任何信息
                            // result.Finished = true;
                        }
                        else
                        {
                            result.Value = resultCount;
                            result.ErrorInfo = errorInfo;
                            result.String = errorCode;
                        }
                        wait_events.finish_event.Set();
                        return;
                    }

                    proc(
                        cache,
                        resultCount,
                        start,
                        records,
                        errorInfo,
                        errorCode);

                    if (records != null)
                    {
                        recieved += GetCount(records);      // records.Count;
                    }
                    if (errorCode == "_complete")
                    {
                        result.Value = resultCount;
                        wait_events.finish_event.Set();
                        return;
                    }

                    if (resultCount >= 0 &&
                        IsComplete(request.Start, request.Count, resultCount, recieved) == true)
                    {
                        wait_events.finish_event.Set();
                    }
                    else
                    {
                        wait_events.active_event.Set();
                    }
                }))
                {
                    MessageResult temp = await HubProxy.Invoke <MessageResult>(
                        "RequestGetMessage",
                        request).ConfigureAwait(false);

                    if (temp.Value == -1 || temp.Value == 0 || temp.Value == 2)
                    {
                        return(temp);
                    }

                    // result.String 里面是返回的 taskID

                    await WaitAsync(
                        request.TaskID,
                        wait_events,
                        timeout,
                        token).ConfigureAwait(false);

                    return(result);
                }
            }
        }
Пример #11
0
        public async Task <GetConnectionInfoResult> GetConnectionInfoAsync(
            GetConnectionInfoRequest request,
            TimeSpan timeout,
            CancellationToken token)
        {
            GetConnectionInfoResult result = new GetConnectionInfoResult();

            if (result.Records == null)
            {
                result.Records = new List <ConnectionRecord>();
            }

            if (string.IsNullOrEmpty(request.TaskID) == true)
            {
                request.TaskID = Guid.NewGuid().ToString();
            }

            using (WaitEvents wait_events = new WaitEvents())    // 表示中途数据到来
            {
                using (var handler = HubProxy.On <
                           string, long, long, IList <ConnectionRecord>, string, string>(
                           "responseGetConnectionInfo",
                           (taskID, resultCount, start, records, errorInfo, errorCode) =>
                {
                    if (taskID != request.TaskID)
                    {
                        return;
                    }

                    // 装载命中结果
                    if (resultCount == -1 || start == -1)
                    {
                        if (start == -1)
                        {
                            // 表示发送响应过程已经结束。只是起到通知的作用,不携带任何信息
                            // result.Finished = true;
                        }
                        else
                        {
                            result.ResultCount = resultCount;
                            result.ErrorInfo = errorInfo;
                            result.ErrorCode = errorCode;
                        }
                        wait_events.finish_event.Set();
                        return;
                    }

                    result.ResultCount = resultCount;
                    // TODO: 似乎应该关注 start 位置
                    result.Records.AddRange(records);
                    result.ErrorInfo = errorInfo;
                    result.ErrorCode = errorCode;

                    if (IsComplete(request.Start, request.Count, resultCount, result.Records.Count) == true)
                    {
                        wait_events.finish_event.Set();
                    }
                    else
                    {
                        wait_events.active_event.Set();
                    }
                }))
                {
                    MessageResult message = await HubProxy.Invoke <MessageResult>(
                        "RequestGetConnectionInfo",
                        request).ConfigureAwait(false);

                    if (message.Value == -1 || message.Value == 0)
                    {
                        result.ErrorInfo   = message.ErrorInfo;
                        result.ResultCount = -1;
                        result.ErrorCode   = message.String;
                        return(result);
                    }

                    // result.String 里面是返回的 taskID

                    // start_time = DateTime.Now;

                    await WaitAsync(
                        request.TaskID,
                        wait_events,
                        timeout,
                        token).ConfigureAwait(false);

                    return(result);
                }
            }
        }