有谁可以帮我用多个下载线程更新单个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;
});
}
答案 0 :(得分:1)
使用Task.WhenAny
或Stephen Toub's 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
intro post helpful。