Я создаю ASP.NET Core WebApi, который использует Autodesk Model Derivative API для преобразования файла Revit в другой формат файла.После загрузки файла API-интерфейс Autodesk начинает работать в фоновом режиме и может занять несколько минут, чтобы завершить его работу.
Я хочу отслеживать состояние API-интерфейса Autodesk, чтобы узнать, было ли преобразование выполнено.закончил еще и уведомил пользователя.Я ищу лучший способ следить за состоянием задания, не ожидая, и оставляя запрос зависшим на несколько минут.
Я пытался просто выполнить задачу асинхронно, не ожидая результата.Это работало до того момента, когда я захотел обновить значение в моем контексте базы данных, потому что оно было удалено из-за того, что запрос завершился.
Я также исследовал несколько вариантов реализации фоновых служб, ноне нашел четкого способа сделать это.
public async Task<ActionResult<Response<JobResponse>>> UploadFile(string bucketKey, IFormFile file)
{
// ....
// File has been uploaded
Response<JobResponse> response
= await NetworkManager.PostAsync<JobResponse>(URI.Job.Url, JsonConvert.SerializeObject(jobData));
// The job has been created in the Autodesk API, so I create a record in my own database
var job = new Job(urn, file.FileName);
context.Jobs.Add(job);
await context.SaveChangesAsync();
// This method is what I want to do in the background
MonitorStatus(job);
return Respond(response);
}
private async Task MonitorStatus(Job job)
{
bool isDone = false;
while (!isDone)
{
isDone = await IsDone(job.Urn);
if (!isDone)
await Task.Delay(10000);
}
string guid = await new JobRepository(job).GetGuid();
// The line underneath throws an error because the context has been disposed
(await context.Jobs.FindAsync(job.Id)).Finish(guid);
await context.SaveChangesAsync();
// ...
// Notify the user
}