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

时间:2014-07-30 02:26:26

标签: c# .net servicestack async-await linq-to-twitter

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

2 个答案:

答案 0 :(得分:3)

您可能会调用Task<T>.ResultTask.Wait进一步调用您的调用堆栈。我将在我的博客中详细描述cause a deadlock

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

最佳解决方案是使用Result替换所有Waitawait来电。

答案 1 :(得分:1)

我认为我面临的真正问题是ServiceStack框架。正如所讨论的那样here。在ServiceStack 4之前,显然不支持路由上的异步功能。