/// <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); }
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)); }
Task WaitAsync(string taskID, WaitEvents wait_events, TimeSpan timeout, CancellationToken cancellation_token) { return(TaskRunAction( () => { Wait(taskID, wait_events, timeout, cancellation_token); }, cancellation_token)); }
/// <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); }
/// <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); }
/// <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); }
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); } } }
// 新版 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); } } }
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); } } }
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); } } }