LinqToTwitter 异步不工作/“名称 'await' 在当前上下文中不存在”和其他问题
LinqToTwitter Async not working / 'The name 'await' does not exist in the current context' and other pains
我一直在玩 Linq to 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;
}
我遇到的问题是它不是异步的(并且需要错误处理)。我对 async 有点不知所措,因为它对我来说是全新的(在 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
});
}
}
}
欢迎在这里提出任何建议。我已经搜索 google 文章和示例代码几个小时了,当我查看翻译时,这些示例与我的示例相距甚远,以至于我看不到从哪里开始 - 我不认为它是得到了奇怪的 'await' 错误的帮助,所以我担心我在某处吠叫错误的树。
第 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' 关键字无效。
我最终弄清楚了这个问题,虽然我不确定是否令人满意。
我最终决定采用上述解决方法。我一直在研究让异步工作。我缺少的技巧是,为了使用 await,包含 await 调用的方法本身必须是异步的。
如果我进行的方法调用是在控制器中,那就没问题了,但事实并非如此,它来自局部。这将是一个重大变化。
为了让事情变得更复杂,我根本不希望在数据 returned 之前呈现页面,因为由于站点设计的性质,这样做会产生一些重大的前端挑战。
总结一下...
如果您真的想要它异步,那么您需要 return 来自控制器方法的数据。如果你不这样做,那么我认为我上面的解决方法应该适合你。
我一直在玩 Linq to 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;
}
我遇到的问题是它不是异步的(并且需要错误处理)。我对 async 有点不知所措,因为它对我来说是全新的(在 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
});
}
}
}
欢迎在这里提出任何建议。我已经搜索 google 文章和示例代码几个小时了,当我查看翻译时,这些示例与我的示例相距甚远,以至于我看不到从哪里开始 - 我不认为它是得到了奇怪的 'await' 错误的帮助,所以我担心我在某处吠叫错误的树。
第 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' 关键字无效。
我最终弄清楚了这个问题,虽然我不确定是否令人满意。
我最终决定采用上述解决方法。我一直在研究让异步工作。我缺少的技巧是,为了使用 await,包含 await 调用的方法本身必须是异步的。
如果我进行的方法调用是在控制器中,那就没问题了,但事实并非如此,它来自局部。这将是一个重大变化。
为了让事情变得更复杂,我根本不希望在数据 returned 之前呈现页面,因为由于站点设计的性质,这样做会产生一些重大的前端挑战。
总结一下...
如果您真的想要它异步,那么您需要 return 来自控制器方法的数据。如果你不这样做,那么我认为我上面的解决方法应该适合你。