void OnGUI_AsyncJob()
        {
            if (m_CurrentJob == null)
            {
                if (m_AutoRefreshRegistered)
                {
                    EditorApplication.update -= Repaint;
                    m_AutoRefreshRegistered   = false;
                }
                return;
            }

            if (!m_AutoRefreshRegistered)
            {
                m_AutoRefreshRegistered   = true;
                EditorApplication.update += Repaint;
            }

            #if !UNITY_2020_1_OR_NEWER
            GUILayout.BeginHorizontal(EditorStyles.toolbar, GUILayout.Height(EditorGUIUtility.singleLineHeight));
            var progressRect = GUILayoutUtility.GetRect(0, float.MaxValue, EditorGUIUtility.singleLineHeight, float.MaxValue);
            EditorGUI.ProgressBar(progressRect, m_CurrentJob.progress, m_CurrentJob.message);
            if (GUILayout.Button(UIUtils.Text("Cancel"), EditorStyles.toolbarButton))
            {
                m_CurrentJob.Cancel();
            }
            GUILayout.EndVertical();
            #endif

            if (m_CurrentJob.IsComplete())
            {
                m_CurrentJob = null;
            }
        }
Beispiel #2
0
        void AsyncWrite(IAsyncJob job)
        {
            if (this._QueueItems.Count == 0)
            {
                return;
            }

            List <LogItem> items = new List <LogItem>(this._QueueItems.Count);

            LogItem item;

            while (this._QueueItems.TryDequeue(out item))
            {
                items.Add(item);
            }

            try
            {
                this.OnWrite(items.ToArray());
            }
            catch (Exception ex)
            {
                GA.WriteUnhandledException("日志线程崩溃了:{0}", ex);
                job.Cancel();
            }
        }
Beispiel #3
0
 public AsyncJob(IAsyncJob job)
 {
     this.Job     = job;
     Status       = new MarkdownFileHandler.JobStatus();
     Status.State = JobState.NotStarted;
     JobTracker.QueueJob(this.Status);
 }
Beispiel #4
0
 /// <summary>
 /// Schedule a fire-and-forget background job in the future.
 /// </summary>
 public static string Schedule <TParameters>(
     this IAsyncJob <TParameters> job,
     TimeSpan delay,
     TParameters parameters)
     where TParameters : class => BackgroundJob.Schedule(
     () => job.HandleAsync(null, parameters, CancellationToken.None),
     delay
     );
Beispiel #5
0
        private async Task <TResult> ExecuteRequestCoreAsync <TResult>(
            string operationName,
            IAsyncJob <TResult> request,
            string requestName,
            CancellationToken cancellationToken)
            where TResult : ICallbackMsg
        {
            await requestSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);

            try
            {
                EnsureConnectedAndLoggedOn();

                var telemetry = new DependencyTelemetry {
                    Name = operationName
                };
                telemetry.Type      = "Steam3";
                telemetry.Target    = steamClient.RemoteIP?.ToString();
                telemetry.Data      = requestName;
                telemetry.Timestamp = DateTimeOffset.UtcNow;
                var timer = Stopwatch.StartNew();

                try
                {
                    request.Timeout = Timeout;

                    // A fallback timeout is used in case SteamKit deadlocks.
                    var response = await timeoutPolicy
                                   .ExecuteAsync(request.ToTask, continueOnCapturedContext : false)
                                   .ConfigureAwait(false);

                    telemetry.Success = true;

                    return(response);
                }
                catch (TaskCanceledException ex)
                {
                    telemetry.Success = false;
                    throw new SteamClientApiException("Request timed out.", ex);
                }
                catch (Exception) when(telemetry.MarkAsUnsuccessful())
                {
                    // Unreachable
                    throw;
                }
                finally
                {
                    timer.Stop();
                    telemetry.Duration = timer.Elapsed;
                    telemetryClient.TrackDependency(telemetry);
                }
            }
            finally
            {
                requestSemaphore.Release();
            }
        }
        void OnGUI_Execute(List <GUIAction> actions)
        {
            foreach (var action in actions)
            {
                switch (action.kind)
                {
                case GUIActionKind.OpenSelectedAsset:
                    OpenAsset(m_SelectedAsset);
                    break;

                case GUIActionKind.LoadAssetMetaData:
                    m_AssetMetadata = ShaderAnalysisUtils.LoadAssetMetadatasFor(m_CurrentPlatform);
                    break;

                case GUIActionKind.LoadAssetReferenceMetaData:
                    m_AssetMetadataReference =
                        ShaderAnalysisUtils.LoadAssetMetadatasFor(m_CurrentPlatform, referenceFolder);
                    break;

                case GUIActionKind.BuildReportJob:
                {
                    m_CurrentJob = action.jobBuilder();
                    if (m_CurrentJob != null)
                    {
                        m_JobAssets[m_CurrentJob] = action.asset;
                        m_CurrentJob.OnComplete(OnBuildReportJobComplete);
                    }
                    break;
                }

                case GUIActionKind.ExportReport:
                {
                    var assetGUID          = ShaderAnalysisUtils.CalculateGUIDFor(action.asset);
                    var report             = m_AssetMetadata.GetReport(assetGUID);
                    var tempReportFile     = ShaderAnalysisUtils.GetTemporaryReportFile(action.asset, m_CurrentPlatform);
                    var tempReportFileName = ExporterUtilities.ChangeExtensionFor(m_ReportExporterIndex, tempReportFile.FullName);
                    ExporterUtilities.Export(m_ReportExporterIndex, report, tempReportFileName);
                    Application.OpenURL(tempReportFileName);
                    break;
                }

                case GUIActionKind.SetAsReference:
                    SetAsReference(m_CurrentPlatform, action.assetGUID, action.report);
                    break;

                case GUIActionKind.ExportDiffReport:
                {
                    var diff                 = ShaderAnalysisUtils.DiffReports(action.report, action.reportReference);
                    var exportFile           = ShaderAnalysisUtils.GetTemporaryDiffFile(action.assetGUID, m_CurrentPlatform);
                    var exportReportFileName = ExporterUtilities.ChangeExtensionFor(m_ReportExporterIndex, exportFile.FullName);
                    ExporterUtilities.ExportDiff(m_ReportDiffExporterIndex, diff, exportReportFileName);
                    Application.OpenURL(exportReportFileName);
                    break;
                }
                }
            }
        }
Beispiel #7
0
 /// <summary>
 /// Recur a background job.
 /// </summary>
 public static void Recur(
     this IAsyncJob job,
     string name,
     string cron,
     TimeZoneInfo timeZone = null) => RecurringJob.AddOrUpdate(
     name,
     () => job.HandleAsync(null, CancellationToken.None),
     cron,
     timeZone
     );
        public virtual async Task <InvocationResult> Dispatch(InvocationContext context)
        {
            JobDescription jobdef;

            if (!_jobMap.TryGetValue(context.Invocation.Job, out jobdef))
            {
                throw new UnknownJobException(context.Invocation.Job);
            }
            _currentJob = jobdef;

            ILifetimeScope scope = null;

            using (scope = _container.BeginLifetimeScope(b =>
            {
                b.RegisterType(jobdef.Implementation).As(jobdef.Implementation);
                b.RegisterInstance(context).As <InvocationContext>();
                b.Register(ctx => scope)
                .As <ILifetimeScope>();
            }))
            {
                var job = (JobHandlerBase)scope.Resolve(jobdef.Implementation);

                Func <Task <InvocationResult> > invocationThunk = () => job.Invoke(context);
                if (context.Invocation.IsContinuation)
                {
                    IAsyncJob asyncJob = job as IAsyncJob;
                    if (asyncJob == null)
                    {
                        // Just going to be caught below, but that's what we want :).
                        throw new InvalidOperationException(String.Format(
                                                                CultureInfo.CurrentCulture,
                                                                Strings.JobDispatcher_AsyncContinuationOfNonAsyncJob,
                                                                jobdef.Name));
                    }
                    invocationThunk = () => asyncJob.InvokeContinuation(context);
                }

                InvocationEventSource.Log.Invoking(jobdef);
                InvocationResult result = null;

                try
                {
                    context.SetJob(jobdef, job);

                    result = await invocationThunk();
                }
                catch (Exception ex)
                {
                    result = InvocationResult.Faulted(ex);
                }
                _currentJob = null;
                _lastJob    = jobdef;
                return(result);
            }
        }
Beispiel #9
0
 /// <summary>
 /// Recur a background job.
 /// </summary>
 public static void Recur <TParameters>(
     this IAsyncJob <TParameters> job,
     string name,
     string cron,
     TimeZoneInfo timeZone  = null,
     TParameters parameters = null)
     where TParameters : class => RecurringJob.AddOrUpdate(
     () => job.HandleAsync(null, parameters, CancellationToken.None),
     cron,
     timeZone
     );
Beispiel #10
0
        void AsyncWrite(IAsyncJob job)
        {
            if(this._QueueItems.Count == 0) return;

            List<LogItem> items = new List<LogItem>(this._QueueItems.Count);

            LogItem item;
            while(this._QueueItems.TryDequeue(out item)) items.Add(item);

            try
            {
                this.OnWrite(items.ToArray());
            }
            catch(Exception ex)
            {
                GA.WriteUnhandledException("日志线程崩溃了:{0}", ex);
                job.Cancel();
            }
        }
Beispiel #11
0
        private async Task <TResult> ExecuteRequestAsync <TResult>(
            string operationName,
            IAsyncJob <TResult> request,
            string requestName,
            CancellationToken cancellationToken)
            where TResult : ICallbackMsg
        {
            using (var operation = telemetryClient.StartOperation <DependencyTelemetry>(operationName))
            {
                var telemetry = operation.Telemetry;
                telemetry.Type   = "Steam3";
                telemetry.Target = steamClient.RemoteIP?.ToString();
                telemetry.Data   = requestName;

                try
                {
                    if (Log.IsDebugEnabled)
                    {
                        Log.Debug($"Start download {operationName} {requestName}");
                    }
                    var response = await retryPolicy
                                   .ExecuteAsync(cancellation => ExecuteRequestCoreAsync(operationName, request, requestName, cancellation), cancellationToken)
                                   .ConfigureAwait(false);

                    if (Log.IsDebugEnabled)
                    {
                        Log.Debug($"End download {operationName} {requestName}");
                    }
                    telemetry.Success = true;

                    return(response);
                }
                catch (Exception) when(operation.Telemetry.MarkAsUnsuccessful())
                {
                    // Unreachable
                    throw;
                }
            }
        }
        void OnBuildReportJobComplete(IAsyncJob obj)
        {
            var asset = m_JobAssets[obj];

            m_JobAssets.Remove(obj);

            var job = obj as AsyncBuildReportJob;

            Assert.IsNotNull(job);

            ShaderBuildReport report = null;

            if (job.IsComplete() &&
                job.hasReport &&
                (report = job.builtReport) != null)
            {
                var metadata  = ShaderAnalysisUtils.LoadAssetMetadatasFor(job.target);
                var assetGUID = ShaderAnalysisUtils.CalculateGUIDFor(asset);
                metadata.SetReport(assetGUID, report);
                ShaderAnalysisUtils.SaveAssetMetadata(metadata);
            }
        }
Beispiel #13
0
 /// <summary>
 /// Schedule a fire-and-forget background job in the future.
 /// </summary>
 public static string Schedule(
     this IAsyncJob job,
     TimeSpan delay) => BackgroundJob.Schedule(
     () => job.HandleAsync(null, CancellationToken.None),
     delay
     );
Beispiel #14
0
 public AsyncJobService(int dueTime, int period, Func <TJob> createJob) : base(dueTime, period)
 {
     _job = createJob();
 }
Beispiel #15
0
 /// <summary>
 /// Enqueue a fire-and-forget background job immediately.
 /// </summary>
 public static string Enqueue <TParameters>(
     this IAsyncJob <TParameters> job,
     TParameters parameters) => BackgroundJob.Enqueue(
     () => job.HandleAsync(null, parameters, CancellationToken.None)
     );
Beispiel #16
0
 /// <summary>
 /// Enqueue a fire-and-forget background job immediately.
 /// </summary>
 public static string Enqueue(
     this IAsyncJob job) => BackgroundJob.Enqueue(
     () => job.HandleAsync(null, CancellationToken.None)
     );
 public static void ExecuteAsyncJob(ImageShrinkerViewModel context, IBackgroundWorkerUi uiResponder, IAsyncJob job)
 {
     var backgroundWorker = new BackgroundWorker();
     backgroundWorker.DoWork += job.BackgroundWorkerOnDoWork;
     backgroundWorker.WorkerSupportsCancellation = true;
     backgroundWorker.RunWorkerCompleted += (s, e) =>
     {
         uiResponder.OnWorkerCompleted();
         AsyncJobRunning = false;
     };
     uiResponder.Worker = backgroundWorker;
     job.Prepare(context, uiResponder);
     AsyncJobRunning = true;
     backgroundWorker.RunWorkerAsync();
     uiResponder.AfterAsyncStart();
 }
Beispiel #18
0
 /// <summary>Whether this job has completed.</summary>
 /// <param name="job">The job to check.</param>
 /// <returns><c>true</c> when the job has completed, <c>false</c> otherwise.</returns>
 public static bool IsComplete(this IAsyncJob job) => job.progress >= 1;
Beispiel #19
0
 /// <summary>
 /// Creates a Task object from an IAsyncJob instance
 /// </summary>
 /// <param name="job"></param>
 public static Task CreateTaskFromJob(IAsyncJob job)
 {
     // job.Task.ConfigureAwait(false).GetAwaiter();
     Awaiter.Instance.Jobs.Add(job);
     return job.Task;
 }
Beispiel #20
0
 public Task StartJobAsync(IAsyncJob <TParameter> job, string jobId, string cronExpression, TParameter parameter)
 {
     _recurringJobClient.AddOrUpdate(jobId, () => job.ExecuteAsync(parameter), cronExpression);
     return(Task.CompletedTask);
 }
Beispiel #21
0
 public Task <string> StartJobAsync(IAsyncJob <TParameter> job, TimeSpan delay, TParameter parameter)
 {
     return(Task.FromResult(_backgroundJobClient.Schedule(() => job.ExecuteAsync(parameter), delay)));
 }
Beispiel #22
0
 /// <summary>
 /// 初始化一个 <see cref="LoggerBase"/> 类的新实例。
 /// </summary>
 public LoggerBase()
 {
     this._ajob = Ajob.Loop(AsyncWrite, TimeSpan.FromSeconds(1));
 }
Beispiel #23
0
 public Task <string> StartJobAsync(IAsyncJob <TParameter> job, TParameter parameter)
 {
     return(Task.FromResult(_backgroundJobClient.Enqueue(() => job.ExecuteAsync(parameter))));
 }
Beispiel #24
0
 /// <summary>
 /// Creates a Task object from an IAsyncJob instance
 /// </summary>
 /// <param name="job"></param>
 public static Task CreateTaskFromJob(IAsyncJob job)
 {
     // job.Task.ConfigureAwait(false).GetAwaiter();
     Awaiter.Instance.Jobs.Add(job);
     return(job.Task);
 }
 public static void ExecuteAsyncJobWithDialog(ImageShrinkerViewModel context, IBackgroundWorkerUi uiResponder, IAsyncJob job)
 {
     ExecuteAsyncJob(context, uiResponder, job);
     ShowDialog((ViewModel)uiResponder);
 }
Beispiel #26
0
 /// <summary>
 /// 初始化一个 <see cref="LoggerBase"/> 类的新实例。
 /// </summary>
 public LoggerBase()
 {
     this._ajob = Ajob.Loop(AsyncWrite, TimeSpan.FromSeconds(1));
 }