У меня очень длинный процесс на Azure. Случается, что выполнение останавливается в случайный момент, даже не выходя из журнала или сообщения об ошибке. Иногда это длится несколько часов подряд, иногда всего пару минут. Это не происходит на моем локальном ПК.App закрывается на Azure, но не на локальном компьютере
Некоторые люди уже ответили на аналогичные вопросы, предлагая, чтобы превращение приложения в «Всегда включено» решает проблему, но это не в моем случае. Проблема продолжается.
Я читал другие сообщения об этом вопросе, и некоторые ответы предлагали попробовать использовать WebJobs. Я не могу, потому что мое приложение имеет 150 МБ, и это превышает максимальный размер файла WebJobs.
О проекте: это реализация алгоритма обнаружения и распознавания тяжелых лиц, предоставляемого третьей стороной. Весь код, который я не вижу, окружен инструкциями try.
Вот как я вызываю функцию:
Task.Run(()=> loopDeReconhecimento(biometricClient, code, photosInfo,ultimoIndiceReconhecido, totalNumberOfFiles,outPutDestionation));
private async void loopDeReconhecimento(NBiometricClient biometricClient, string code, List<PhotoInfo> photosInfo,int ultimoIndiceReconhecido, int totalNumberOfFiles,string outPutDestionation)
{
WebClient wc = new WebClient();
for (int i = ultimoIndiceReconhecido; i < totalNumberOfFiles; i++)
{
if (forceStop.Contains(code))
{
Log.register(code, "STOPPING!!!!");
forceStop.Remove(code);
return;
}
if (i >= photosInfo.Count)
{
i--;
try
{
Log.register(code, "Fim das fotos upadas por enquanto foi encontrado. Esperando trinta segundos, baixando novamente as informações e tentando de novo " + DateTime.Now.ToLongTimeString());
Thread.Sleep(30000);
wc.DownloadFile(pathWebBase + code + @"/" + @"1.Eventos_grande_simples/imagensConfig.txt", outPutDestionation);
//Log.register(code,"Tempo de download: " + tempoTotal);
PhotoInfo.init(File.ReadAllLines(outPutDestionation), photosInfo);
} catch
{
Log.register(code, "Attempt to download failed. Try again in 30 seconds");
}
continue;
}
Log.register(code, "Starting photo " + i.ToString() + " de " + totalNumberOfFiles);
recognizePhoto(biometricClient,wc, code, photosInfo[i], photosInfo, tentativasPorFoto);
status = i.ToString() + @"/" + totalNumberOfFiles.ToString();
if (forceSave.Contains(code) || (double)i/salvarACadaQuantas == Math.Floor((double)i/salvarACadaQuantas))
{
forceSave.Remove(code);
salvar(i, code, photosInfo);
}
}
Log.register(code, "Fim.");
}
void recognizePhoto(NBiometricClient biometricClient,WebClient wc, string code, PhotoInfo photoInfo, List<PhotoInfo> photosInfo, int attempts)
{
try
{
Log.register(code, "Foto iniciada: " + photoInfo.shortAdress);
NBiometricStatus status;
string localPath = localPathBase + code + @"\Fotos a separar\1.Eventos_grande" + photoInfo.shortAdress;
Stopwatch sw = new Stopwatch();
sw.Start();
NSubject candidateSubject = CreateSubjectFromURL(pathWebBase + code + @"/1.Eventos_grande_simples" + photoInfo.shortAdress, true);
status = biometricClient.CreateTemplate(candidateSubject);
if (status != NBiometricStatus.Ok)
{
Log.register(code, "Template creation was unsuccessful. Status: " + status);
return;
}
else
{
Log.register(code, "Created: Status: " + status);
}
// Set ids to candidate subjects and related subjects
int i = 1;
candidateSubject.Id = "ID_0";
Log.register(code, "Subject na foto: Status: " + candidateSubject.Id);
PersonTagInfo pti = detalharFace(candidateSubject, biometricClient, code);
if (pti != null)
photoInfo.peopleTags.Add(pti);
foreach (var subject in candidateSubject.RelatedSubjects)
{
subject.Id = string.Format("ID_{0}", i++);
Log.register(code, "Subject found in photo: Status: " + subject.Id);
pti = detalharFace(subject, biometricClient, code);
if (pti != null)
photoInfo.peopleTags.Add(pti);
}
identificarESalvarPersonTagInfo(biometricClient, photoInfo, candidateSubject, code);
foreach (NSubject candidato in candidateSubject.RelatedSubjects)
{
identificarESalvarPersonTagInfo(biometricClient, photoInfo, candidato, code);
}
photoInfo.done = true;
Log.register(code, "Tempo de processamento: " + sw.ElapsedMilliseconds);
} catch
{
if (attempts > 0)
{
Log.register(code, "Erro ao processar foto. Tentando novamente em 1 segundo. Tentativas restantes: " + attempts.ToString());
Thread.Sleep(1000);
recognizePhoto(biometricClient,wc, code, photoInfo,photosInfo, attempts - 1);
}
}
}
Можете ли вы предоставить нам более подробно о том, что это долго работает процесс, как он был первоначально реализован (я предполагаю, что в настоящий момент в качестве/действия WebAPI MVC) и как ваш WebJob исполняемый (и зависимостям) удается превысить 150 МБ. –
Он использует сторонний SDK для обнаружения и распознавания лиц. Первоначально он был реализован как веб-приложение. Я изменил вопрос, чтобы вы могли видеть код – Lucas