代码之家  ›  专栏  ›  技术社区  ›  lost9123193

在C中暂停聚合馈送#

c#
  •  1
  • lost9123193  · 技术社区  · 6 年前

    我有下面的代码来读取提要

    XmlReader reader = XmlReader.Create(url)
    SyndicationFeed feed = SyndicationFeed.Load(reader)
    

    我必须考虑到互联网不工作的情况。我注意到每当wifi关闭时,代码就会在加载(读卡器)时暂停。

    因为技术上没有错误,所以我抓不到代码。

    如果未启用WiFi,我不想用SyndicationFeed加载读卡器。我应该用计时器吗?最好的办法是什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   johnny 5    6 年前

    有几种方法可以做到这一点。一种方法是使慢位异步,然后添加 timeout to the task .

    这还有一个优点,即在执行操作时不阻塞ui。

    由于api本身不是异步的,因此您必须自己包装它。

    下面是一些我的示例代码:

    async Task Main()
    {
        //Normal speed
        var feed = await GetFeed("https://taeguk.co.uk/feed/");
        Console.WriteLine(feed);
    
        //Too Slow = null
        feed = await GetFeed("http://www.deelay.me/2000/https://taeguk.co.uk/feed/");
        Console.WriteLine(feed);
    }
    
    async Task<SyndicationFeed> GetFeed(String url)
    {
        var task = Task.Factory.StartNew(() =>
                {
                    XmlReader reader = XmlReader.Create(url);
                    return SyndicationFeed.Load(reader);
                });
    
        int timeout = 1000;
        if (await Task.WhenAny(task, Task.Delay(timeout)) == task)
        {
            return await task;
        }
        else
        {
            return null;
        }
    }