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

LinqtoTwitter TweetAsync在ServiceStack App中永远不会返回

您可能在调用堆栈中有对Task<T>.ResultTask.Wait的调用。这将导致死锁,我将在我的博客中详细描述。

await将在默认情况下捕获一个"上下文"(例如,一个UI上下文)并使用它来恢复async方法。当TweetAsync任务完成时,它尝试在该上下文中恢复(例如,在UI线程上),但它不能,因为在该上下文中已经有一个线程阻塞(即,调用Result/Wait)。

最好的解决方案是将所有ResultWait调用替换为await

我认为我面临的真正问题是ServiceStack框架。正如这里所讨论的。显然,直到ServiceStack 4才支持路由上的异步函数。