プログラムを閉じたり開いたりするたびに、バックグラウンドワーカーの進行状況を保存およびロードする方法はありますか?
1 に答える
私は通常、このようにします。
メイン プログラムで、すべてのジョブ パラメータと結果を含む「ジョブ クラス」を作成します。
次に、バックグラウンド ワーカーを実行し、ジョブ クラスをバックグラウンド ワーカーに渡します。
backgroudworker では、そのクラスの進行状況を追跡します。
あなたの場合、ジョブの中止をサポートし、これまでの結果をメインプログラムに戻し、xml シリアライゼーションまたはその他の方法で保存する必要があります。
次に、プログラムを 2 回目にロードするときは、ジョブ クラスにすべてを再度ロードして、実行を継続する必要があります。
Public Class Job
public JobProgress as integer
public JobStillRunning as boolean
end class
仕事に関係するものはすべてここに入れます...
次に、ジョブを次のように呼び出します。
BackgroundWorker1.RunWorkerAsync(MyJob)
バックグラウンド プロセスで、クラスを取得できます。
dim MyJob as Job = trycast(e.Argument, job)
進行状況の更新と終了で同じことを行い、クラスを渡し続けます...
クラスを XML に保存する方法:
Dim Serializer As New System.Xml.Serialization.XmlSerializer(GetType(Job))
Using OutPutStream As System.IO.FileStream = New FileStream(OutPutFile, FileMode.CreateNew)
Serializer.Serialize(OutPutStream, MyJob)
End Using
そして、それを再度ロードする方法;
Dim Serializer As New System.Xml.Serialization.XmlSerializer(GetType(Job))
Using InputStream As System.IO.FileStream = New FileStream(AdminSettingsFile, FileMode.Open, FileAccess.Read, FileShare.Read)
MyJob = Serializer.Deserialize(InputStream)
End Using
2 行の追加コードで圧縮して暗号化することもできます。しかし、私はあなたがそれを必要とするとは思わない...
すべてのタイプがシリアル化をサポートしているわけではないことに注意してください。たとえば、コレクションとソートリストはシリアル化されません。それらをフラット配列に変換する必要があります。