使用LinqToTwitter时,状态更新会在没有问题的情况下发布到twitter,但是路由超时,并且在await行之后调试if语句时,调试器永远不会到达该点。我该怎么做才能解决这个问题?
async public Task<object> Post(RetweetPost retweetInfo){
...
var auth = new SingleUserAuthorizer
{
CredentialStore = new SingleUserInMemoryCredentialStore
{
ConsumerKey = "ConsumerKey",
ConsumerSecret = "ConsumerSecret",
AccessToken = account.OAuthToken,
AccessTokenSecret = account.OAuthTokenSecret
}
};
var twitterCtx = new TwitterContext(auth);
var tweet = await twitterCtx.TweetAsync(retweetInfo.tweet);
//DOES NOT REACH THIS LINE
if (tweet != null)
{
return new RetweetPostResponse
{
twitterTweetId = tweet.StatusID.ToString()
};
}
答案 0 :(得分:3)
您可能会调用Task<T>.Result
或Task.Wait
进一步调用您的调用堆栈。我将在我的博客中详细描述cause a deadlock。
await
默认捕获“上下文”(例如,UI上下文),并使用它来恢复async
方法。当TweetAsync
任务完成时,它会尝试在该上下文中恢复(例如,在UI线程上),但它不能,因为已经在该上下文中阻塞了一个线程(即,调用Result
/ Wait
)。
最佳解决方案是使用Result
替换所有Wait
和await
来电。
答案 1 :(得分:1)
我认为我面临的真正问题是ServiceStack框架。正如所讨论的那样here。在ServiceStack 4之前,显然不支持路由上的异步功能。