Mam następujący problem - w momencie próby połączenia z Azure blob, chciałbym ograniczyć czas wykonywania metody w momencie, gdy kontener blob nie jest włączony Aktualnie metoda blob.ExistsAsync()
wykonuje się spokojnie ponad 30 sekund, zanim zostanie rzucony wyjątek o nieaktywnym dostępie do bazy plikowej. W tym celu zrobiłem rozszerzenia do klasy TimeSpan
, z czego jedno z nich, które potrzebuję do tego zadania, to:
public static TResult ExecuteWithTimeLimit<TResult>(this TimeSpan timeSpan, Func<TResult> codeBlock)
where TResult : class
{
var task = Task.Run(codeBlock);
if (!task.Wait(timeSpan))
{
throw new TimeoutException("The function has taken longer than the maximum time allowed.");
}
return task.Result;
}
Którego z kolei używam dla tej metody:
async Task<CloudBlockBlob> GetFileBlob()
{
return await TimeSpan.FromMilliseconds(TaskExecutionMaximumDelay).ExecuteWithTimeLimit(async () =>
{
var container = GetBlobContainer(fileContainerType);
var blob = container.GetBlockBlobReference(fileName);
if (!await blob.ExistsAsync()) // tutaj wątek się blokuje
{
throw new UserFriendlyException(L("FileNotFound"));
}
await blob.FetchAttributesAsync();
return blob;
});
}
Rozwiązanie wydaje się w porządku w sytuacji, jak w środku nie dzieje się nic z wykorzystaniem await
. Jednak dla przypadku wyżej rozwiązanie w ogóle nie działa. Mógłby ktoś pomóc, jak usprawnić to rozwiązanie/napisać nowe dostosowane do moich potrzeb? Siedzę już nad tym trochę czasu.