私は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スレッドであり、バックグラウンドスレッドではないので、バックグラウンドワーカー内で呼び出すことができませんでした。私は物事を移動しようとしたので、最初にダイアログを呼び出し、バックグラウンドワーカーとそのすべてを作成しますが、何らかの理由でそれを動作させることができませんでした。
私は、単純に私の関数の同期バージョンを作成することでその周りにいたので、ユーザーがプログラムを終了し、これらの関数のいずれかを呼び出して閉じる必要があります代わりに '。それは動作します。ありがとう!
haha ...私はバックグラウンドワーカーの読み解きをしなければなりませんでした....しかし、あなたの答えに感謝します。ありがとうございました!! – Andarta