在这里使用任务有优势吗
Is there an advantage to using a task here
我有一个方法正在考虑使用任务来完成一些工作。但在这种情况下真的有优势吗?我的推理是因为 CheckInToWebDocs
方法依赖于 SaveDocument
.
创建的文件的存在
没有任务
Private Sub PopulatePDF()
Dim PrintLib As New Print
Dim sPDFFilePath As String = ""
If PrintLib.CreateEnrolledApp(EnrollmentID, sPDFFilePath) Then
AppName = Page.ResolveUrl("~\SomeLocation\" & Path.GetFileName(sPDFFilePath))
hlApplication.NavigateUrl = AppName
SaveDocument(Constants.enumDocumentTypes.Application, EnrollmentID, Path.GetFileName(sPDFFilePath), sPDFFilePath)
CheckInToWebDocs(EnrollmentID, sPDFFilePath)
End If
End Sub
使用任务
Private Sub PopulatePDF()
Dim PrintLib As New Print
Dim sPDFFilePath As String = ""
If PrintLib.CreateEnrolledApp(EnrollmentID, sPDFFilePath) Then
AppName = Page.ResolveUrl("~\SomeLocation\" & Path.GetFileName(sPDFFilePath))
hlApplication.NavigateUrl = AppName
Dim saveDocumentTask As Task = Task.Run(Sub() SaveDocument(Constants.enumDocumentTypes.Application, EnrollmentID, Path.GetFileName(sPDFFilePath), sPDFFilePath))
saveDocumentTask.Wait()
CheckInToWebDocs(EnrollmentID, sPDFFilePath)
End If
End Sub
不是您使用它的方式。它会增加并行任务的开销,但您仍然需要等待任务完成。
是否有 SaveDocument
的异步变体?如果是这样,那么您可以创建自己的 PopulatePDF()
异步方法,调用 Await SaveDocumentAsync(...)
(如果命名遵循约定)。然后 PopulatePDF
的任何消费者都可以 也 是异步的,包括对 UI 事件的响应,这些事件会给你带来我认为你正在寻找的好处。
对评论的回复:真可惜。在这种情况下我要说的是:将 Task.Run
添加到您的实施中仍然没有任何好处。这可能很诱人,但您需要注意这会产生一个新线程。也就是说,如果你这样做:
Private Async Function PreparePdfAsync() As Task
...
Await Task.Run(Sub() SaveDocument(...))
...
End Function
您只会在后台线程上获得 伪造 异步代码——同步代码 运行。在 UI 场景中,您最好的选择是让 UI 消费者在需要时自行调用 Task.Run()
,不要将这些细节隐藏起来,因为线程生成是非明显且可能有害的行为。
有关 Task.Run etiquette 的更多信息,请参阅 Stephen Cleary,如果您是 Async/Await 的新手,请务必阅读他的其他介绍文章。
我有一个方法正在考虑使用任务来完成一些工作。但在这种情况下真的有优势吗?我的推理是因为 CheckInToWebDocs
方法依赖于 SaveDocument
.
没有任务
Private Sub PopulatePDF()
Dim PrintLib As New Print
Dim sPDFFilePath As String = ""
If PrintLib.CreateEnrolledApp(EnrollmentID, sPDFFilePath) Then
AppName = Page.ResolveUrl("~\SomeLocation\" & Path.GetFileName(sPDFFilePath))
hlApplication.NavigateUrl = AppName
SaveDocument(Constants.enumDocumentTypes.Application, EnrollmentID, Path.GetFileName(sPDFFilePath), sPDFFilePath)
CheckInToWebDocs(EnrollmentID, sPDFFilePath)
End If
End Sub
使用任务
Private Sub PopulatePDF()
Dim PrintLib As New Print
Dim sPDFFilePath As String = ""
If PrintLib.CreateEnrolledApp(EnrollmentID, sPDFFilePath) Then
AppName = Page.ResolveUrl("~\SomeLocation\" & Path.GetFileName(sPDFFilePath))
hlApplication.NavigateUrl = AppName
Dim saveDocumentTask As Task = Task.Run(Sub() SaveDocument(Constants.enumDocumentTypes.Application, EnrollmentID, Path.GetFileName(sPDFFilePath), sPDFFilePath))
saveDocumentTask.Wait()
CheckInToWebDocs(EnrollmentID, sPDFFilePath)
End If
End Sub
不是您使用它的方式。它会增加并行任务的开销,但您仍然需要等待任务完成。
是否有 SaveDocument
的异步变体?如果是这样,那么您可以创建自己的 PopulatePDF()
异步方法,调用 Await SaveDocumentAsync(...)
(如果命名遵循约定)。然后 PopulatePDF
的任何消费者都可以 也 是异步的,包括对 UI 事件的响应,这些事件会给你带来我认为你正在寻找的好处。
对评论的回复:真可惜。在这种情况下我要说的是:将 Task.Run
添加到您的实施中仍然没有任何好处。这可能很诱人,但您需要注意这会产生一个新线程。也就是说,如果你这样做:
Private Async Function PreparePdfAsync() As Task
...
Await Task.Run(Sub() SaveDocument(...))
...
End Function
您只会在后台线程上获得 伪造 异步代码——同步代码 运行。在 UI 场景中,您最好的选择是让 UI 消费者在需要时自行调用 Task.Run()
,不要将这些细节隐藏起来,因为线程生成是非明显且可能有害的行为。
有关 Task.Run etiquette 的更多信息,请参阅 Stephen Cleary,如果您是 Async/Await 的新手,请务必阅读他的其他介绍文章。