LinqtoTwitter TweetAsync在ServiceStack App中永远不会返回
本文关键字:永远 返回 App TweetAsync ServiceStack LinqtoTwitter | 更新日期: 2023-09-27 18:15:37
当使用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()
};
}
您可能在调用堆栈中有对Task<T>.Result
或Task.Wait
的调用。这将导致死锁,我将在我的博客中详细描述。
await
将在默认情况下捕获一个"上下文"(例如,一个UI上下文)并使用它来恢复async
方法。当TweetAsync
任务完成时,它尝试在该上下文中恢复(例如,在UI线程上),但它不能,因为在该上下文中已经有一个线程阻塞(即,调用Result
/Wait
)。
最好的解决方案是将所有Result
和Wait
调用替换为await
。
我认为我面临的真正问题是ServiceStack框架。正如这里所讨论的。显然,直到ServiceStack 4才支持路由上的异步函数。