Я пытаюсь проверить URL-адреса изображений, чтобы узнать, действительно ли они действительны. У меня так много из них, что для выполнения этой задачи требуются часы. Поэтому я решил сделать это асинхронно. Я хотел бы знать, есть ли какие-либо большие различия или преимущества в моем коде, как показано ниже.с использованием Parallel.ForEach с/или async/await
Мои основные функции:
Async Function testUrl_async(ByVal myImageurl As String) As Task(Of Boolean)
myHttpResponse = Await myHttpClient.GetAsync(myImageurl)
If myHttpResponse.IsSuccessStatusCode Then
mySuccess = True
Else
mySuccess = False
End If
Return mySuccess
End Function
Function testUrl(ByVal myImageurl As String) As Boolean
myHttpResponse = myHttpClient.GetAsync(myImageurl)
If myHttpResponse.IsSuccessStatusCode Then
mySuccess = True
Else
mySuccess = False
End If
Return mySuccess
End Function
1) с помощью асинхр ждут.
For Each myImage In myImages
Dim result=await testUrl_async(myImageUrl).Result
'some code
Next
2) с использованием параллельного Еогеаспа
Parallel.ForEach(myImages,
Sub(myImage)
testUrl(pictureComponent.websiteShop.hqpatronen, myImageUrl)
'some code
End Sub)
3) с использованием параллельного Еогеаспа и asnyc/ждет
Parallel.ForEach(myImages,
Sub(myImage)
await testUrl_async(pictureComponent.websiteShop.hqpatronen, myImageUrl)
'some code
End Sub)
Третий может быть лучшим решением, но это не позволит мне для звонка Await
/Async
в пределах ForEach
.
Если я использую второй, функция testurl
имеет HTTP вызов асинхронной, но не с Await
, thereofore он падает с сообщением исключения:
[TaskCanceledException:. Задача была отменена]
на линии, которая вызывает myHttpClient.GetAsync
. Я предполагаю, что он выбрасывает это исключение, потому что ForEach
закончился, и отмена была запрошена, но httpclient еще не завершил свою работу. Как я могу справиться с этим, если это может быть лучшим решением?
Альтернативно любое другое решение, которое ускоряет мою работу.
Это может быть хорошей задачей для TPL DataFlow, который обеспечивает грубую функциональность Parallel.ForEach с поддержкой асинхронным. –
это новый и поддерживается только 4,5 и более поздними версиями? – batmaci
@batmaci Как и 'async/await', да –