2016-11-03 11 views
1

私はvb.netデスクトップアプリケーションを作成しています。このアプリケーションにはいくつかの非同期関数が含まれています。ユーザーが右上隅の赤いXを使用してアプリケーションを閉じると、これらの非同期関数の1つ以上を実行するロジックがあります。問題は、プログラムが完了する前に終了することです。私は私の呼び出しで "Await"を使用すると考えていましたが、明らかにそうではありませんでした。vb.netアプリケーションが終了する前に非同期タスクが完了することを確認する

私はthis thread that talks about using ManualResetEventを見つけましたが、問題はコンソールアプリケーションのコンテキストにあり、MSDNのドキュメントには単に非同期タスクを使用するのではなく、スレッドを指定するためのものです。とにかくそれを使用しての試みとして、私は私のメインフォームにこれを追加してみました:

これらの関数のいずれかへの呼び出し後

ManualResetEvent =新ManualResetEventなどの公共resetEvent(偽)

、すぐに、私は、この(引用は、コールが含まれます)を追加しました:

Await activeCount.SerializeAsync(activeCount) 
resetEvent.WaitOne() 

をそして、私の非同期機能自体の最後で、タスクを返す前に、この追加:

私はその権利を使用しているとは思わない。プログラムはそれが完了する前にまだ終了します。

その前でさえ、私はそのようなもののための最良の場所はApplicationEvents MyApplication_Shutdownにあると考えましたが、そのような機能がまだその時点で実行されているかどうかを知る方法はわかりません。

このような状況でアプリケーションが終了する前に、すべての非同期関数が完了するようにするにはどうすればよいでしょうか?

ありがとうございました!受け入れ答えAFTER


UPDATE:しかしはF0r3v3r-A-N00Bの答えが働い

、私は、ある場合には、ダイアログを使用する必要が実現しました。ダイアログがGUIスレッドであり、バックグラウンドスレッドではないので、バックグラウンドワーカー内で呼び出すことができませんでした。私は物事を移動しようとしたので、最初にダイアログを呼び出し、バックグラウンドワーカーとそのすべてを作成しますが、何らかの理由でそれを動作させることができませんでした。

私は、単純に私の関数の同期バージョンを作成することでその周りにいたので、ユーザーがプログラムを終了し、これらの関数のいずれかを呼び出して閉じる必要があります代わりに '。それは動作します。ありがとう!

答えて

1

これを試してください。新しいプロジェクトを作成します。あなたのフォームに1ラベルとバックグラウンドワーカーを追加します。これをフォームのコードエリアに貼り付けてください:

Public Class Form1 
Dim taskCompleted As Boolean = False 
Dim taskIsrunning As Boolean = False 

Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 
    Threading.Thread.Sleep(5000) 
End Sub 






Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted 
    taskCompleted = True 
    taskIsRunning = False 
    Label1.Text = "Background task completed." 
    Me.Close() 
End Sub 






Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing 
    If taskIsRunning Then 
     e.Cancel = True 
     Exit Sub 
    End If 

    If Not taskCompleted Then 
     taskIsRunning = True 
     Label1.Text = "Starting background task." 
     BackgroundWorker1.RunWorkerAsync() 
     Label1.Text = "Background task is running." 
     e.Cancel = True 
    End If 
End Sub 
End Class 
+0

haha​​ ...私はバックグラウンドワーカーの読み解きをしなければなりませんでした....しかし、あなたの答えに感謝します。ありがとうございました!! – Andarta

関連する問題