LinqToTwitter 异步不起作用/“'等待'这个名字在当前上下文中不存在”和其他痛苦

本文关键字:上下文 不存在 痛苦 其他 不起作用 异步 等待 LinqToTwitter | 更新日期: 2023-09-27 17:56:01

我一直在推特上玩Linq,经过很多痛苦,终于得到了一些结果。此代码正在工作...

    public IList<ITweet> BuildForAuthor(string author)
    {
        var result = new List<ITweet>();
        context = context != null ? context : new TwitterContext(_auth);
        var tweets = (from tweet in context.Status
                      where tweet.Type == StatusType.User &&
                            tweet.ScreenName == author
                      select tweet).Take(4).ToList();
        if (tweets != null)
        {
            foreach (var tweet in tweets)
            {
                if (!tweet.Retweeted)
                {
                    result.Add(new Tweet
                    {
                        Author = tweet.ScreenName,
                        Text = tweet.Text
                    });
                }
                else
                {
                    result.Add(new Tweet
                    {
                        Author = tweet.RetweetedStatus.User.ScreenNameResponse,
                        Text = tweet.RetweetedStatus.Text,
                        Retweet = true,
                        RetweetedBy = tweet.ScreenName
                    });
                }
            }
        }
        return result;
    }

我遇到的问题是它不是异步的(它需要错误处理)。我对异步有点陌生,因为它对我来说是全新的(多年来一直在 JavaScript 中这样做,所以这个概念被理解了)。LinqToTwitter 的文档坚持认为它必须是异步的,但所有的异步示例都不适合我。

这完全是错误的...

    public IList<ITweet> BuildForAuthor(string author)
    {
        var result = new List<ITweet>();
        context = context != null ? context : new TwitterContext(_auth);
            // This is the example as given in the LinqToTwitter documentation, but the 'await' command doesn't work - I see an error 'The name 'await' does not exist in the current context' - errr...
            var tweets = await (from tweet in context.Status
                                where tweet.Type == StatusType.User &&
                                      tweet.ScreenName == author
                                select tweet).ToListAsync();
            // This code is completely wrong - I'm not sure what to do here - In JS I'd be looking at a callback, but C# seems to just continue after from the examples I've looked at, however 'tweets' is no longer a list, it's a 'Task' so not much use to me here.
        if (tweets != null)
        {
            foreach (var tweet in tweets)
            {
                if (!tweet.Retweeted)
                {
                    result.Add(new Tweet
                    {
                        Author = tweet.ScreenName,
                        Text = tweet.Text
                    });
                }
                else
                {
                    result.Add(new Tweet
                    {
                        Author = tweet.RetweetedStatus.User.ScreenNameResponse,
                        Text = tweet.RetweetedStatus.Text,
                        Retweet = true,
                        RetweetedBy = tweet.ScreenName
                    });
                }
            }
        }

这里的任何建议都将非常受欢迎。我已经在谷歌文章和示例代码中搜寻了几个小时,当我查看翻译时,这些示例离我太远了,以至于我看不到从哪里开始 - 我认为我得到的奇怪的"等待"错误对此没有帮助,所以我担心我在某处吠错了树。

第二天

经过更多的阅读,我现在有了更多类似的东西......

            var tweets = (from tweet in context.Status
                      where tweet.Type == StatusType.User &&
                            tweet.ScreenName == author
                      select tweet).Take(4).ToListAsync();
        tweets.Wait();
        if (tweets != null)
        {
            foreach (var tweet in tweets.Result)
            {
                ...

(以上摘自第二个代码块) - 这似乎可以在推文任务上手动调用 Wait() 方法,但仍然没有回答为什么"await"关键字不起作用的问题。

LinqToTwitter 异步不起作用/“'等待'这个名字在当前上下文中不存在”和其他痛苦

我最终找到了这个问题的底部,尽管我不确定是否令人满意。

上面的解决方法是我最终决定采用的。我一直在研究如何使异步工作。我缺少的技巧是,为了使用 await,包含 await 调用的方法本身必须是异步的。

如果我进行的方法调用在控制器中,这很好,但事实并非如此,它来自部分。这将是一个重大变化。

为了使事情变得更加复杂,我从根本上不希望页面在数据返回之前呈现,因为由于网站设计的性质,这样做会产生一些重大的前端挑战。

总结一下...

如果你真的想要它异步,那么你需要从控制器方法返回数据。如果您不这样做,那么我认为我上面的解决方法应该对您有用。