Beispiel #1
0
 /// <summary>
 /// Creates and schedules an execution of a request for the given beacon event.
 /// </summary>
 /// <param name="beaconEventArgs">The beacon event details.</param>
 /// <returns>The request ID.</returns>
 public int CreateRequest(BeaconEventArgs beaconEventArgs)
 {
     int requestId = SDKData.Instance.NextId();
     Request request = new Request(beaconEventArgs, requestId);
     request.Result += OnRequestResult;
     _requestQueue.Add(request);
     return requestId;
 }
        public void Add(Request request)
        {
            lock(_listLocker)
            {
                _requestList.Add(request);

                if (_requestList.Count > 0 && _serveRequestTimer == null)
                {
                    _serveRequestTimer = new Timer(ServeNextRequestAsync, null, 0, ServeRequestIntervalInMilliseconds);
                }
                if (QueueCountChanged != null)
                {
                    QueueCountChanged(this, _requestList.Count);
                }
            }
        }
        internal async Task<RequestResultState> InternalExecuteRequestAsync(Request request)
        {
            System.Diagnostics.Debug.WriteLine("LayoutManager.InternalExecuteRequestAsync(): Request ID is " + request.RequestId);
            RequestResultState resultState = RequestResultState.Failed;

            if (request != null && request.BeaconEventArgs != null && request.BeaconEventArgs.Beacon != null)
            {
                if (await VerifyLayoutAsync(false))
                {
                    request.ResolvedActions = _layout.GetResolvedActionsForPidAndEvent(
                        request.BeaconEventArgs.Beacon.Pid, request.BeaconEventArgs.EventType);

                    foreach (ResolvedAction resolvedAction in request.ResolvedActions)
                    {
                        if (resolvedAction != null && resolvedAction.BeaconAction != null)
                        {
                            resolvedAction.BeaconAction.Id = request.RequestId;
                        }
                    }

                    resultState = RequestResultState.Success;
                }
            }

            return resultState;
        }
        /// <summary>
        /// Sets the request result and removes it from the queue.
        /// </summary>
        /// <param name="request"></param>
        /// <param name="resultState"></param>
        /// <returns>True, if the request was successfully removed from the queue.</returns>
        private bool OnRequestServed(Request request, RequestResultState resultState)
        {
            bool wasRemoved = false;

            if (request != null)
            {
                lock (_listLocker)
                {
                    wasRemoved = _requestList.Remove(request);
                    request.NotifyResult(resultState);

                    if (_requestList.Count == 0 && _serveRequestTimer != null)
                    {
                        _serveRequestTimer.Dispose();
                        _serveRequestTimer = null;
                    }
                    if (QueueCountChanged != null)
                    {
                        QueueCountChanged(this, _requestList.Count);
                    }
                }
            }

            return wasRemoved;
        }
 /// <summary>
 /// Executes the given request.
 /// </summary>
 /// <param name="request"></param>
 /// <returns>The result state (success or failure).</returns>
 public IAsyncOperation<RequestResultState> ExecuteRequestAsync(Request request)
 {
     IAsyncOperation<RequestResultState> resultState = InternalExecuteRequestAsync(request).AsAsyncOperation<RequestResultState>();
     return resultState;
 }