Vb.net 异步等待任务。运行更新模式窗体引发异常
我有两张表格 它运行良好,但若我按下模态窗体的取消按钮,则显示错误。 有人能帮我解决这个问题吗? 我的代码如下: (一) (二)Vb.net 异步等待任务。运行更新模式窗体引发异常,vb.net,Vb.net,我有两张表格 它运行良好,但若我按下模态窗体的取消按钮,则显示错误。 有人能帮我解决这个问题吗? 我的代码如下: (一) (二) 如果不告诉我们错误类型和消息是什么,我们怎么可能帮助您?错误是什么?我认为只有当RunLongTask完成时,对话框才会显示。另外,.No,它运行正常,但当我按下取消按钮时,它的显示错误。怎样,我可以发送我的项目文件吗?错误:-System.InvalidOperationException未经处理消息:mscorlib.dll中发生类型为“System.Invali
如果不告诉我们错误类型和消息是什么,我们怎么可能帮助您?错误是什么?我认为只有当RunLongTask完成时,对话框才会显示。另外,.No,它运行正常,但当我按下取消按钮时,它的显示错误。怎样,我可以发送我的项目文件吗?错误:-System.InvalidOperationException未经处理消息:mscorlib.dll中发生类型为“System.InvalidOperationException”的未经处理的异常其他信息:跨线程操作无效:从创建它的线程以外的线程访问控件“Progress1”打开。
runlongstask
确实需要是一个返回任务的函数
,而不是子任务
。然后您可以正确地等待它,而无需使用任务。运行。这将允许您正确处理任何异常。
Public Class FRMWait
Public MinValue As Integer = 0
Public MaxValue As Integer = 100
Private Sub FRMWait_Load(sender As Object, e As EventArgs) Handles MyBase.Load
With Me
.ProgressBa1.MinimumValue = .MinValue
.ProgressBa1.MaximumValue = .MaxValue
End With
End Sub
Public Sub UpdateBar(ByVal Progress As Integer)
With Me
.ProgressBarControlProgress.value = Progress
End With
End Sub
Private Sub ButtonCancel_Click(sender As Object, e As EventArgs) Handles ButtonCancel.Click
With Me
.DialogResult = DialogResult.Cancel
End With
End Sub
End Class
Imports System.Threading
Public Class FRMTest
Private WaitForm As New FRMWait
Private _CTS As CancellationTokenSource
Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'Control.CheckForIllegalCrossThreadCalls = False
End Sub
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
With Me
.WaitForm = New FRMWait
._CTS = New CancellationTokenSource()
Try
Await Task.Run(Sub() RunLongTask())
.WaitForm.ShowDialog()
If .WaitForm.DialogResult = DialogResult.Cancel Then
._CTS.Cancel()
End If
Catch Exp As Exception
MsgBox(Exp.Message)
Finally
If ._CTS IsNot Nothing Then ._CTS = Nothing
End Try
End With
End Sub
Private Async Sub RunLongTask()
With Me
.WaitForm.MinValue = 0
.WaitForm.MaxValue = 100
For i = 0 To 100
If ._CTS.IsCancellationRequested Then
Await Task.Delay(1000)
Exit For
End If
.WaitForm.UpdateBar(i)
Await Task.Delay(100)
Next
.WaitForm.Close()
End With
End Sub
End Class