c#异步任务运行,返回函数带有参数

时间:2018-08-15 18:12:50

标签: c# wpf asynchronous

因此,我已经在网络上搜索了异步执行一些繁重任务以保持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更新与该数据无关,只是更新标签,按钮等。

1 个答案:

答案 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.
    // ...
}