我尝试验证我的图片URL,以确定它们是否有效。由于我有很多URL需要验证,完成此任务需要数小时时间。因此,我决定异步进行操作。我想知道按照下面的代码进行操作是否有任何巨大的差异或优势。
我的主要功能如下:
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)使用async await。
For Each myImage In myImages
Dim result=await testUrl_async(myImageUrl).Result
'some code
Next
2) 使用并行foreach
Parallel.ForEach(myImages,
Sub(myImage)
testUrl(pictureComponent.websiteShop.hqpatronen, myImageUrl)
'some code
End Sub)
3) 使用并行foreach和异步/等待
Parallel.ForEach(myImages,
Sub(myImage)
await testUrl_async(pictureComponent.websiteShop.hqpatronen, myImageUrl)
'some code
End Sub)
第三种可能是最好的解决方案,但它不允许我在ForEach中调用Await/Async。
如果我使用第二种方法,则testurl函数具有异步http调用,但不带Await,因此会崩溃并显示异常消息:
[TaskCanceledException: A task was canceled.]
在调用myHttpClient.GetAsync的行上。我猜这会抛出此异常,因为ForEach已经结束,并且请求取消了,但是httpclient还没有完成其工作。如果这可能是最佳解决方案,我该如何处理?
或者任何其他使我的工作更快的解决方案。
async/await
一样,是的。 - Panagiotis Kanavosasync/await
并不需要任何额外的IL。即使在C#5中,编译器也会生成状态机来处理等待。这就是为什么需要Microsoft.Build
——它实际上改变了项目构建的方式。兼容性包不会修改运行时本身,也不会添加任何新的IL。 - Panagiotis Kanavos