0

谁能帮我用多个下载线程更新单个 UI 线程?在 C# 中使用 WinRT。

我目前正在使用 Task.Run。它可以工作,但由于它传播到多个线程处理,程序无法正确更新单个 UI。

方法 UpdateRSSItemAsync() 下载绑定到 UI (ListView) 的内容(它将更新 RSSItemList)。

谢谢,

程序按顺序运行良好

// Run multiple tasks in sequential order
foreach (SyndicationItem item in CurrentFeed.Items)
{
    if (m_bDownloadInterrupted)
        break;

    RssItemList = await UpdateRSSItemAsync(CurrentRSSDataGroup, RssItemList, CurrentFeed, item);

}

但是,如果在多个线程中运行,则无法更新 UI

// Run multiple tasks in multiple threads
foreach (SyndicationItem item in CurrentFeed.Items)
{
    if (m_bDownloadInterrupted)
        break;

    RssItemList = await Task.Run<List<RSSItem>>(async () =>
    {
        RssItemList = await UpdateRSSItemAsync(CurrentRSSDataGroup, RssItemList, CurrentFeed, item);
        return RssItemList;
    });
}
4

1 回答 1

1

使用Task.WhenAnyStephen Toub 的Interleaved

var tasks = CurrentFeed.Items.Select(item => UpdateRSSItemAsync(CurrentRSSDataGroup, RssItemList, CurrentFeed, item)).ToList();
while (tasks.Count != 0)
{
  var completedTask = await Task.WhenAny(tasks);
  tasks.Remove(completedTask);
  ProcessRssItem(await completedTask);
}

您可能会发现我的async/await介绍帖子很有帮助

于 2012-09-26T02:36:48.700 回答