Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 异步等待任务。运行更新模式窗体引发异常_Vb.net - Fatal编程技术网

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