我一直使用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