首页 文章

LinqToTwitter Async无法工作/ 'The name '等待' does not exist in the current context'和其他痛苦

提问于
浏览
0

我一直在和Linq一起玩Twitter,经过很多痛苦,终于得到了一些结果 . 这段代码正在运行......

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
                    });
                }
            }
        }

这里的任何建议都是最受欢迎的 . 我一直在搜索谷歌文章和示例代码几个小时,当我正在查看翻译时,这些例子离我很远,我看不到从哪里开始 - 我不认为这有点奇怪我正在等待'等待'错误,所以我担心我在某处咆哮着错误的树 .

第2天

经过更多的阅读后,我现在有了更像这样的东西......

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)
            {
                ...

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

1 回答

  • 0

    我最终走到了最底层,虽然是否令人满意,但我不确定 .

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

    如果我正在制作的方法调用是在控制器中,这本来没问题,但事实并非如此,它来自部分 . 这将是一个重大变化 .

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

    总结一下......

    如果您确实希望它是异步的,那么您需要从控制器方法返回数据 . 如果你不这样做,我认为上面的解决方法对你有用 .

相关问题