Мне нужно, чтобы мой веб-сервис 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; }
}
}