Мне нужен простой и пошаговый пример того, как реализовать отчеты о прогрессе в веб-сервисе в ASP.NET с помощью async / await - PullRequest
0 голосов
/ 08 октября 2019

Мне нужно, чтобы мой веб-сервис asp.net mvc был асинхронным. Мне также нужно использовать IProgress типа: MyObjectType для захвата прогресса и отображения на стороне клиента. Мой веб-сервис сам возвращает json. каждый раз, когда вызывается веб-служба, создается идентификатор задачи GUID, который добавляется в словарь. Я не знаю, как использовать все это вместе.

        [Route("api/M1Async")]
        [HttpPost]
        public async Task<dynamic> M1Async()
        {
            string pathh = HttpContext.Current.Request.Headers["path"];
            // Create a new taskId on first call

            ProgessReporting p = new ProgessReporting();
            Guid taskId = Guid.NewGuid();
            tasks.Add(taskId, p);

            try
            {
                //start the long task
                var result = await System.Threading.Tasks.Task.Run(() =>
                {
                    return M1(pathh, new Progress<ProgessReporting>(percent => { p.ProgressPercent = percent.ProgressPercent; p.TaskId = percent.TaskId; }));
                });           

                // remove the new task from the task list
                tasks.Remove(taskId);

                return result;
            }
            catch (Exception ex)
            {
                // TODO
                return false;
                // throw exception
            }

это M1:

        [Route("api/M1n")]
        [HttpPost]
        public async Task<dynamic> M1(string path, IProgress<ProgessReporting> progress)
        {
            ProgessReporting epr = new ProgessReporting();
epr.ProgressPercent= 10;
... do some stuff

                Thread.Sleep(100); // CPU-bound work
                if (progress != null)
                    progress.Report(epr);
return json;

и классы:

        private static IDictionary<Guid, ProgessReporting> tasks = new Dictionary<Guid, ProgessReporting>();
        public class ProgessReporting
        {

            private string _taskId;

            public string TaskId
            {
                get { return _taskId; }
                set { _taskId = value; }
            }



            private string _progressPercent;

            public string ProgressPercent
            {
                get { return _progressPercent; }
                set { _progressPercent = value; }
            }

        }
...