我一直使用BackgroundWorker的,我是新来的异步/等待关键字。现在,我想从BackgroundWorker的重构一些代码,以异步/等待(这是一个WPF MVVM应用程序)。重构BackgroundWorker的非同步的/等待
GenerateCommand = new DelegateCommand(GenerateHandler, CanGenerate);
我见过有一个“AsyncCommand”在开发表达lib下,这可能会为我工作:
我在虚拟机,这是实例化这样得到的命令。
所有处理程序都会将事件处理程序注册到完成的事件并在服务上调用生成方法。
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关键字现在和我必须等待我的异步方法。我tryed以纪念worker_DoWork为异步和等待的生成方法的调用,但随后的生成方法,已被标记为异步太为了awaitable在VM的GenerateHandler?
很抱歉,如果我迷惑你,但是这一切都是升技混淆我...
感谢您的帮助
您应该能够完全迁移到异步/通过改写DoWork的事件处理异步方法的await和在代码中的某处等待,然后完全删除BackgroundWorker。 –
'GenerateHandler'和'GenerateMdfHandler'是一个错字还是他们是不同的方法? – Sam
@Sam这是一个错字,很抱歉 – user3292642