【问题标题】:How to pass value from Dispatcher or Task to outside?如何将值从 Dispatcher 或 Task 传递到外部?
【发布时间】:2012-07-11 07:51:56
【问题描述】:

谁能帮我在任务之间传递变量?

我遇到了关于 Dispatcher.RunAsync() 的问题。我将变量 RssItem 声明为 RSSItem 的类型。 我正在尝试将 Dispatcher.RunAsync(...) 中的 await m_RSSReader.CreateRSSItem() 返回的 RssItem 的值传递到外部以分配 m_RssItemList.Add(RssItem);。

RSSItem RssItem;
// Save Individual RSS items as RSSItem
foreach (SyndicationItem item in CurrentFeed.Items)
{
    //RssItem = new RSSItem();
    // by using dispatcher, it resolves the issue of lagging UI
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
        {
            RssItem = await m_RSSReader.CreateRSSItem(item.Links[0].Uri, m_CurrentRSSDataGroup, item, CurrentFeed);
        });

        if (RssItem != null)
        {
            Debug.WriteLine("RssItem Title : {0}", RssItem.Title);
            m_RssItemList.Add(RssItem);
        }
}

[7/11/12] RSSItem 是我为存储而创建的一个类。我使用 Dispatcher.RunAsync() 来避免 UI 中断,方法 m_RSSReader.CreateRSSItem() 将返回我想要的类 (RSSItem RssItem)。但我需要将它传递到 Dispatcher 任务之外并将 RssItem 添加到列表中 (m_RssItemList.Add(RssItem)。但是我无法将 RssItem 传递到 Dispatcher 之外。

谢谢,

【问题讨论】:

  • 到底是什么问题?你的代码是做什么的?
  • RSSItem 是我为存储而创建的一个类。我使用 Dispatcher.RunAsync() 来避免 UI 中断,方法 m_RSSReader.CreateRSSItem() 将返回我想要的类 (RSSItem RssItem)。但我需要将它传递到 Dispatcher 任务之外并将 RssItem 添加到列表中 (m_RssItemList.Add(RssItem)。但是我无法在 Dispatcher 之外传递 RssItem。

标签: c# asynchronous task dispatcher async-await


【解决方案1】:

我不知道您是否使用Task.Run 解决了这个问题,但如果您确实想等待dispatcher.RunAsync,您也可以使用WaitHandle,例如ManualResetEvent。出于某种原因,RunAsync 调用会继续,而实际上并没有“等待”。等待句柄负责处理。

// assign to null, since it will be "unassigned" otherwise
RssItem rssItem = null;
EventWaitHandle waithandle = new ManualResetEvent(false);
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
{
    rssItem = await m_RSSReader.CreateRSSItem(item.Links[0].Uri, m_CurrentRSSDataGroup, item, CurrentFeed);
    waithandle.Set();
});

waithandle.WaitOne();
if (rssItem != null)
{
    Debug.WriteLine("RssItem Title : {0}", rssItem.Title);
    m_RssItemList.Add(rssItem);
}

【讨论】:

    【解决方案2】:

    我不认为 Dispatcher.RunAsync 做你认为它做的事。

    我相信您正在寻找的是Task.Run,类似于:

    RssItem = await Task.Run(() =>
       m_RSSReader.CreateRSSItem(item.Links[0].Uri, m_CurrentRSSDataGroup, item, CurrentFeed)
    );
    

    【讨论】:

    • 谢谢。我试过了,但我实际上需要 Dispatcher.RunAsync() 来动态添加 UI 元素。方法 CreateRSSItem() 将添加 UI 元素。
    • 那你必须在 UI 线程上做。 Dispatcher 在你的情况下根本帮不了你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 2011-01-22
    • 1970-01-01
    • 2021-05-26
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多