Возможно ли, что метод GetOsmData
никогда не вернется при некоторых условиях?Чтобы исключить такую возможность, вы можете принудительно отключить ее по истечении разумного периода времени.Вы можете использовать метод расширения ниже для достижения этого:
public static Task<T> TimeoutAfter<T>(this Task<T> task, int timeout)
{
var delayTask = Task.Delay(timeout).ContinueWith<T>(_ => throw new TimeoutException(),
TaskContinuationOptions.ExecuteSynchronously);
return Task.WhenAny(task, delayTask).Unwrap();
}
Его можно использовать так:
osmData = await GetOsmData(_osmUrl.Replace("articlenumber",
product.MaterialNumber.ToString())).TimeoutAfter(5000).ConfigureAwait(false);
Это не постоянное исправление, потому что мы не знаем, чтоСледующим будет GetOsmData
задание, так как теперь оно стало мошенником .Плохой сценарий состоит в том, что он будет постоянно удерживать поток пула потоков, и рано или поздно пул потоков будет исчерпан из-за слишком большого количества мошеннических задач.Надеюсь, это не та проблема, с которой вы сталкиваетесь, потому что, если это так, ее решить непросто.