我有一个活动,我需要在C#/ XAML应用程序的后台线程上运行,所以我这样做:
Task.Factory.StartNew(() => ImportFile());
我将Task值返回到另一段代码,然后需要在基于线程的工作完成后执行操作。代码如下所示:
Action<Task> finalise = async delegate { await FinishImport(dbList); };
dbList.ImportFileAsync().ContinueWith(finalise);
但是,当我运行代码时,FinishImport
中的调试语句正在后台线程完成之前执行。
我在这里误解了什么?我认为ContinueWith
的重点在于它会在目标任务完成后执行延续代码。
答案 0 :(得分:1)
您应该在Task.Run
代码中使用Task.Factory.StartNew
而不是async
。 Task.Run
了解async
方法,而StartNew
将返回仅代表Task
方法开头的async
。
作为旁注,通常最好不要在库方法中隐藏Task.Run
。
此外,使用await
比使用ContinueWith
要容易得多。 async
方法应以“异步”结束。
因此,应用这些指南会使您的代码看起来像:
await Task.Run(() => dbList.ImportFileAsync());
await FinishImportAsync(dbList);
答案 1 :(得分:0)
ImportFileAsync()
做了什么?
finalise
将在ImportFileAsync()
的帖子结束后运行
如果
ImportFileAsync(){ Task.Factory.StartNew(() => ImportFile());}
然后ImportFileAsync
将调用ImportFile()
的新主题,然后退出它将不会等待ImportFile()
完成
你想做什么
Task.Factory.StartNew(() => dbList.ImportFile()).ContinueWith(finalise);