0

私のアプリケーションには、ファイナライズに時間がかかる長時間実行されるメソッドがあるため、それを別のタスクにプッシュし、その間ShowDialogに砂時計アニメーションが配置された新しいフォームを表示し、タスクがジョブを終了したらこのフォームを閉じる必要があります。その瞬間の状況は、私の新しい待機フォームがまったく閉じようとせず、ただ現れてとどまるということです。その場合、ユーザーがフォームで手動で閉じるをクリックするまでShowDialog何も返されないため、何も返されないため、どこかで読みましたが、ユーザーがそのフォームをクリックするのと同じである必要があります。ポイントを達成するために何を変更する必要があるかについて、ここで説明とサポートをお願いします。私のコードの下。Closeform.Close

メインフォーム:

WinScp = New WinScpOperation("ftp", "myserver", "login", "password", 21, 0)

Dim tsk As Task(Of Boolean) = Task.Factory.StartNew(Of Boolean)(Function()
   Return WinScp.GetFile(myremotePicturePath, ladujZdjeciaPath, True)
End Function)

Dim pic As New Waiting
pic.ShowDialog() 'show waiting form

Task.WaitAll(tsk) 'waiting on task to be finalized

pic.Close() 'close waiting form
...

待機フォーム (砂時計の gif のみ)

Public Class Waiting
End Class

さらなる議論 #1:

オプション 1: (作業中のバージョン)

 Dim pic As New Waiting

                            Dim tsk As Task(Of Boolean) =
    Task.Factory.StartNew(Of Boolean)(
        Function()
            ' Run lenghty task
            Dim Result As Boolean = WinScp.GetFile(myremotePicturePath, ladujZdjeciaPath, True)
            ' Close form once done (on GUI thread)
            pic.Invoke(New Action(Sub() pic.Close()))
            Return Result
        End Function)

                            ' Show the form
                            pic.ShowDialog()
                            Task.WaitAll(tsk)

オプション 2: (動作しない理由??)

    Dim pic As New Waiting

                            Dim tsk As Task(Of Boolean) =
    Task.Factory.StartNew(Of Boolean)(
        Function()
            ' Run lenghty task
            Dim Result As Boolean = WinScp.GetFile(myremotePicturePath, ladujZdjeciaPath, True)

            Return Result
        End Function)

                            ' Show the form
                            pic.ShowDialog()
                            Task.WaitAll(tsk)
  ' Close form once done (on GUI thread)
            pic.Invoke(New Action(Sub() pic.Close()))

追加の質問:

                        Dim pic As New Waiting

                        Dim tsk As Task(Of Boolean) =
Task.Factory.StartNew(Of Boolean)(
    Function()
        ' Run lenghty task
        Dim Result As Boolean = WinScp.GetFile(myremotePicturePath, ladujZdjeciaPath, True)
        ' Close form once done (on GUI thread)
        pic.Invoke(New Action(Sub() pic.Close()))
        Return Result
    End Function)

                        ' Show the form
                        pic.ShowDialog()
                        Task.WaitAll(tsk)

                        If tsk.Result Then 'if return value is true
                            'Do something when file was downloaded correctly
                        Else
                            'Do something when file was NOT downloaded
                        End If

追加#2:これは元々:

           If WinScp.GetFile(lsbxPicPaths.SelectedItem, temp_dir & "\" & Path.GetFileName(lsbxPicPaths.SelectedItem), False) Then
                temp_pic = temp_dir & "\" & Path.GetFileName(lsbxPicPaths.SelectedItem)
            End If

私は私たちのソリューションを実装しました:

Dim pic As New Waiting


                                Dim tsk As Task(Of Boolean) =
                Task.Factory.StartNew(Of Boolean)(
                   Function()
               Run lenghty task
                      Dim Result As Boolean = WinScp.GetFile(lsbxPicPaths.SelectedItem, temp_dir & "\" & Path.GetFileName(lsbxPicPaths.SelectedItem), False)
                    ' Close form once done (on GUI thread)
                      pic.Invoke(New Action(Sub() pic.Close()))
                      Return Result
                 End Function)

                           ' Show the form
                              pic.ShowDialog()
                            Task.WaitAll(tsk)

                    If tsk.Result Then 'if return value is true

                                   temp_pic = temp_dir & "\" & Path.GetFileName(lsbxPicPaths.SelectedItem)
                '                Else

                                End If

                '*************************************

上記の解決策: 2 つの変数を定義すると、代わりに直接 GetFile 引数に入れる理由がわかりません。以前は変数がなく、機能していたからです。誰かがその行動を説明できますか?

                Dim remotefile As String = lsbxPicPaths.SelectedItem
                Dim temp_file As String = temp_dir & "\" & Path.GetFileName(lsbxPicPaths.SelectedItem)


                'http://stackoverflow.com/questions/33030706/put-long-running-method-into-task-showing-new-form-meantime-and-closing-it-once
                Dim pic2 As New Waiting



                Dim tsk2 As Task(Of Boolean) = Task.Factory.StartNew(Of Boolean)(Function()

                                                                                     'Run lenghty task

                                                                                     Dim Result As Boolean = WinScp.GetFile(remotefile, temp_file, False)
                                                                                     'Close form once done (on GUI thread)
                                                                                     pic2.Invoke(New Action(Sub() pic2.Close()))
                                                                                     Return Result
                                                                                 End Function)
                pic2.ShowDialog()
                Task.WaitAll(tsk2)


                If tsk2.Result = True Then
                    MsgBox("GetFile zwrocilo true")
                    temp_pic = temp_dir & "\" & Path.GetFileName(lsbxPicPaths.SelectedItem)
                End If
4

2 に答える 2