コード例 #1
0
ファイル: ResultType.cs プロジェクト: zorkuat/SharpFutures
 public static FutureResult <T, E> Retry <T, E>(this FutureResult <T, E> t, int upTo)
 {
     return(new FutureResult <T, E>(
                new RunAction <T, E>(
                    (callback) =>
     {
         void tryFuture(FutureResult <T, E> f, int remaining)
         {
             void act(Result <T, E> result)
             {
                 if (result.Successful.Item1)
                 {
                     callback(new Result <T, E>(result.Successful.Item2));
                 }
                 else
                 {
                     if (remaining > 0)
                     {
                         Console.WriteLine($"Retry n: {upTo-remaining}");
                         Console.WriteLine(result.Failure.Item2);
                         tryFuture(f, remaining - 1);
                     }
                     else
                     {
                         callback(new Result <T, E>(result.Failure.Item2));
                     }
                 }
             }
             f.Run(act);
         }
         tryFuture(t, upTo);
     }
                    )
                ));
 }
コード例 #2
0
        private FutureResult <SqlWorkerResult> StartSqlAsyncWorker(CancellationToken token)
        {
            var worker = SqlAsyncWorker.Create(context.Services, upgradeMode.GetSqlWorkerTask(), token);

            return(workerResult =
                       new AsyncFutureResult <SqlWorkerResult>(worker, UpgradeLog.Instance, context.Configuration.BuildInParallel));
        }
コード例 #3
0
        private IDisposable StartSqlWorker()
        {
            var result = CreateResult(SqlWorker.Create(context.Services, upgradeMode.GetSqlWorkerTask()));

            workerResult = result;
            return(result);
        }
コード例 #4
0
        public ResultBase <string> MakeString(int count, char fillchar)
        {
            var future = new FutureResult <string>();

            scheduler.Invoke(new MakeStringRequest(servant, future, count, fillchar));
            return(future);
        }
コード例 #5
0
    void Start()
    {
        // Start the recolection of data from the web services
        _dataRetrievingFuture = BeginDataRetrieving();

        _uiManager.ShowLoadingPanel(true);
        EnableCameraControls(false);
    }
コード例 #6
0
    void BeginModelDownload(FutureResult futureResult, string meshUri, string mtlUri, string textureUri)
    {
        _backendManager.DownloadFile(meshUri, (BackendRequestResult result, string filePath) =>
        {
            if (result.Success)
            {
                _mapModelMeshPath = filePath;
                futureResult.CompletedActions.Add("GetMesh");
            }
            else
            {
                if (!futureResult.Completed)
                {
                    futureResult.Completed = true;
                    futureResult.Success   = false;
                    futureResult.FailureReasons.Add("Failed to Download Mesh File: " + result.ErrorString);
                }
            }
        });

        _backendManager.DownloadFile(mtlUri, (BackendRequestResult result, string filePath) =>
        {
            if (result.Success)
            {
                _mapModelMtlPath = filePath;
                futureResult.CompletedActions.Add("GetMtl");
            }
            else
            {
                if (!futureResult.Completed)
                {
                    futureResult.Completed = true;
                    futureResult.Success   = false;
                    futureResult.FailureReasons.Add("Failed to Download Mtl File: " + result.ErrorString);
                }
            }
        });

        _backendManager.DownloadFile(textureUri, (BackendRequestResult result, string filePath) =>
        {
            if (result.Success)
            {
                _mapModelTexturePath = filePath;
                futureResult.CompletedActions.Add("GetTexture");
            }
            else
            {
                if (!futureResult.Completed)
                {
                    futureResult.Completed = true;
                    futureResult.Success   = false;
                    futureResult.FailureReasons.Add("Failed to Download Texture File: " + result.ErrorString);
                }
            }
        });
    }
コード例 #7
0
ファイル: ResultType.cs プロジェクト: zorkuat/SharpFutures
 public static FutureResult <U, E> Map <T, U, E>(this FutureResult <T, E> t, Func <T, U> f, Func <E, E> e)
 {
     return(new FutureResult <U, E>(
                new RunAction <U, E>(
                    (callback) => {
         void act(Result <T, E> result) => callback(result.Map(f, e));
         t.Run(act);
     }
                    )
                ));
 }
コード例 #8
0
        private MessageDispatchException GetDispatchException(FutureResult <MessageDispatchInfo> futureResult)
        {
            var sourceEx = futureResult.Task.Exception.InnerException;

            if (sourceEx is MessageDispatchException dispatchEx)
            {
                return(dispatchEx);
            }

            return(new MessageDispatchException("Error calling message consumer.",
                                                futureResult.Invoker, sourceEx));
        }
コード例 #9
0
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="futureResult">The future result containing the exception.</param>
        public EnricherException(FutureResult <IMessageEnricher> futureResult)
        {
            Check.NotNull(futureResult, nameof(futureResult));

            var taskException   = futureResult.Task.Exception;
            var sourceException = taskException.InnerException;

            Details = new Dictionary <string, object>
            {
                { "Message", sourceException?.Message },
                { "Enricher", futureResult.Invoker.GetType().FullName }
            };
        }
コード例 #10
0
 // Function that check if all the task are completed.
 // In this case there are always 6 tasks so the system waits that.
 // In case of an error the futureResult will be completed and this coroutine will stop.
 IEnumerator CheckDataRetrieveStatus(FutureResult futureResult)
 {
     while (!futureResult.Completed)
     {
         if (futureResult.CompletedActions.Count == 6)
         {
             futureResult.Completed = true;
             futureResult.Success   = true;
             break;
         }
         yield return(null);
     }
 }
コード例 #11
0
ファイル: Program.cs プロジェクト: zorkuat/SharpFutures
        static void Main(string[] args)
        {
            /////////////////////////////////////////
            // Declaración de servicios utilizados //
            /////////////////////////////////////////
            SessionServices servicios = new SessionServices();
            UXServices      ux        = new UXServices();

            ////////////////
            // Parámetros //
            ////////////////
            Uri u1 = new Uri("http://example.com");
            Uri u2 = new Uri("http://apple.com/");


            FutureResult <int, Exception> wcFirstLink(Uri url)
            {
                return(servicios.get(url)
                       .Map <byte[], Uri, Exception>(ux.ToUTF8.FlatThen(ux.FirstLink, null), null)
                       .FlatMap(servicios.get)
                       .Map <byte[], int, Exception>(ux.ToUTF8.FlatThen(ux.WordCounter, null).FlatThen(ux.UpTo, null), null));
            }

            FutureResult <int, Exception> f1 = wcFirstLink(u1);
            FutureResult <int, Exception> f2 = wcFirstLink(u2);

            FutureResult <int, Exception> wow = Zip(f1, f2)
                                                .Map(ux.Sum, ux.Handler)
                                                .Map(ux.Trace, ux.Handler)
                                                .Map(ux.multiplier(13), ux.FlatHandler)
                                                .Retry(1000);

            wow.Run(
                res => {
                if (res.Successful.Item1)
                {
                    Console.WriteLine(res.Successful.Item2);
                }
                else
                {
                    Console.WriteLine(res.Failure.Item2);
                }
            }
                );
        }
コード例 #12
0
        /// <summary>
        /// Publisher Exception.
        /// </summary>
        /// <param name="futureResult">The task and associated publisher.</param>
        public PublisherException(FutureResult <IMessagePublisher> futureResult) :
            base("Error Invoking Publishers.")
        {
            Check.NotNull(futureResult, nameof(futureResult));

            var taskException   = futureResult.Task.Exception;
            var sourceException = taskException.InnerException;

            Details = new Dictionary <string, object>
            {
                { "Message", sourceException?.Message },
                { "Publisher", futureResult.Invoker.GetType().FullName }
            };

            var dispatchException = sourceException as MessageDispatchException;

            if (dispatchException != null)
            {
                Details["DispatchDetails"] = dispatchException.Details;
            }
        }
コード例 #13
0
ファイル: ResultType.cs プロジェクト: zorkuat/SharpFutures
 public static FutureResult <U, E> FlatMap <T, U, E>(this FutureResult <T, E> t, Func <T, FutureResult <U, E> > f)
 {
     return(new FutureResult <U, E>(
                new RunAction <U, E>(
                    (callback) => {
         void act(Result <T, E> result)
         {
             if (result.Successful.Item1)
             {
                 f(result.Successful.Item2).Run(callback);
             }
             else
             {
                 callback(new Result <U, E>(result.Failure.Item2));
             }
         }
         t.Run(act);
     }
                    )
                ));
 }
コード例 #14
0
 public bool HasResult(out FutureResult <TCommand, RoutingSlipCompleted, TResult> result)
 {
     result = _result;
     return(result != null);
 }
コード例 #15
0
 public MakeStringRequest(Servant servant, FutureResult <string> future, int count, char fillchar)
     : base(servant, future)
 {
     this.count    = count;
     this.fillchar = fillchar;
 }
コード例 #16
0
 protected MethodRequest(Servant servant, FutureResult <T> future)
 {
     this.servant = servant;
     this.future  = future;
 }
コード例 #17
0
    // Class that will start the process of getting all the data from the web services.
    FutureResult BeginDataRetrieving()
    {
        var futureResult = new FutureResult();

        // GetModel Data and then download the files.
        _backendManager.GetModelInfo((BackendRequestResult result, GetModelResponse response) =>
        {
            if (result.Success)
            {
                futureResult.CompletedActions.Add("GetModelInfo");
                BeginModelDownload(futureResult, response.ObjUrl, response.MtlUrl, response.TextureUrl);
            }
            else
            {
                if (!futureResult.Completed)
                {
                    futureResult.Completed = true;
                    futureResult.Success   = false;
                    futureResult.FailureReasons.Add("Failed To Get Model Info");
                }
            }
        });

        // Get the shovel data
        _backendManager.GetShovels((BackendRequestResult result, GetShovelsResponse response) =>
        {
            if (result.Success)
            {
                futureResult.CompletedActions.Add("GetShovels");
                _shovels.Clear();
                _shovels.AddRange(response.Shovels);
            }
            else
            {
                if (!futureResult.Completed)
                {
                    futureResult.Completed = true;
                    futureResult.Success   = false;
                    futureResult.FailureReasons.Add("Failed To Get Shovels");
                }
            }
        });

        // Get the shovel report data
        _backendManager.GetShovelInfo((BackendRequestResult result, GetShovelInfoResponse response) =>
        {
            if (result.Success)
            {
                futureResult.CompletedActions.Add("GetShovelInfo");

                _shovelReports.Clear();
                _shovelReports.AddRange(response.Reports);
            }
            else
            {
                if (!futureResult.Completed)
                {
                    futureResult.Completed = true;
                    futureResult.Success   = false;
                    futureResult.FailureReasons.Add("Failed To Get Shovel Reports");
                }
            }
        });

        StartCoroutine(CheckDataRetrieveStatus(futureResult));

        return(futureResult);
    }
コード例 #18
0
 public FutureResultConfigurator(FutureResult <TCommand, TInput, TResult> result)
 {
     _result = result;
 }