私はいつもBackgroundworkerを使用しましたが、私はasync/awaitキーワードを初めて使用しています。今、Backgroundworkerのコードをasync/await(WPF MVVMアプリケーション)にリファクタリングしようとしています。バックグラウンドワーカーをasync/awaitにリファクタリングする
GenerateCommand = new DelegateCommand(GenerateHandler, CanGenerate);
私はおそらく私のために動作しますdevに「AsyncCommand」libに表現するが、そこで見てきた:
は、私はこのようにインスタンス化された私のVMにコマンドを得ました。すべてのハンドラは、完了したイベントにイベントハンドラを登録し、サービスのGenerateメソッドを呼び出します。
private void GenerateHandler()
{
generatorService.GenerationFinished += OnGenerationFinished;
generatorService.Generate(mDataFields, mGenerateFilesViewModel, mAmount);
}
は、その後のサービスの生成方法は、BackgroundWorkerのを開始します:
public void Generate(IEnumerable<IDataField> dataFields, IGenerateFilesViewModel generateFilesViewModel, int amount)
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += worker_DoWork;
worker.RunWorkerAsync();
}
DoWorkメソッドは、私がマークする必要がどの方法がわからないよ時間のかかるタスク
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
GenerateCommand generateCommand = null;
if (mUploadFiles)
{
generateCommand = new GenerateCommand(mDataFields, mOutputDirectory, mTemplateFileName, mAmount, mSelectedCollection, mSelectedAccountKey);
}
else
{
generateCommand = new GenerateCommand(mDataFields, mOutputDirectory, mTemplateFileName, mAmount);
}
try
{
generateCommand.Execute();
}
catch (SEHException ex)
{
Console.WriteLine(String.Format("Generation of files threw an exception. {0}", ex.Message));
}
}
を行いますasyncキーワードを使って、私の非同期メソッドを待たなければならない場所。私はworker_DoWorkを非同期としてマークし、Generateメソッドの呼び出しを待っていましたが、Generateメソッドは非同期としてもマークされていなければなりませんでした。申し訳ありません
私はあなたを混乱していますが、このすべては、ABIT私を混乱されている場合...助け非同期/のawait構文砂糖メリットがコーディングされた利便性の
あなたは完全に非同期メソッドにDoWorkイベントハンドラを書き換えることにより、非同期/待つために移行することができるはずですし、あなたのコードのどこかでそれを待ってから、BackgroundWorkerを完全に削除してください。 –
'GenerateHandler'と' GenerateMdfHandler'はタイプミスですか、それとも別のメソッドですか? – Sam
@Samそれはタイプミスでした。 – user3292642