因此,我已经在网络上搜索了异步执行一些繁重任务以保持UI响应能力的方法。老实说-我没有找到任何能以我能理解的方式描述我的实际情况的东西。
所以我有以下代码片段:
List<myType> indexedItems = new List<myType>();
Task t = new Task.Run(() => indexedItems = FileHandling.ReadIndexFile(downloadPath));
lblProgress.Content = "Reading index file...";
lstItems.ItemsSource = null;
t.Wait();
我真正想要的是使用ReadIndexFile
的参数运行downloadPath
函数以写入indexItems
的值,同时允许我重新绘制和更改UI,然后等待任务完成。
我在这段代码中遇到了很多问题,我只是想为这种特定情况提供一个示例并进行简要说明。
任何帮助将不胜感激!
编辑 具有原始旧同步的原始代码段。执行以显示会发生什么:
if (File.Exists(downloadPath + @"\index.sbmdi"))
{
lblProgress.Content = "Reading index file...";
lstMangas.ItemsSource = null;
indexedMangas = FileHandling.ReadIndexFile(downloadPath);
categoryList = Library.BuildCategoryList(indexedMangas);
lstMangas.ItemsSource = indexedMangas;
lblProgress.Content = "Ready.";
}
lblProgress.Content = "Ready.";
prgrssUpper.IsIndeterminate = false;
然后,另一种方法中的一些UI更新与该数据无关,只是更新标签,按钮等。
答案 0 :(得分:1)
执行此操作的最佳方法是添加异步方法async Task FileHandling.ReadIndexFileAsync(string path)
。如果您无法更改FileHandling
,请尝试以下操作:
async Task MySnippet(string downloadPath)
{
// Start reading the index file, but don't wait for the result.
Task<List<myType>> indexedItemsTask = Task.Run(() => FileHandling.ReadIndexFile(downloadPath));
// Alternatively, if you can add a method FileHandling.ReadIndexFileAsync:
// Task<List<myType>> indexedItemsTask = FileHandling.ReadIndexFileAsync(downloadPath);
// Update the UI.
lblProgress.Content = "Reading index file...";
lstItems.ItemsSource = null;
// *Now* wait for the result.
List<myType> indexedItems = await indexedItemsTask;
// Do stuff with indexedItems.
// ...
}