【问题标题】:LinqtoTwitter TweetAsync never returns in ServiceStack AppLinqtoTwitter TweetAsync 永远不会在 ServiceStack 应用程序中返回
【发布时间】:2014-07-31 15:11:25
【问题描述】:

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

【问题讨论】:

  • 请尝试放置一个 catch 块并确保没有抛出错误。
  • “从未达到”是什么意思?会挂吗?它是否继续在方法之外执行?你在VS的异常窗口中启用了“CLR Exceptions”吗?
  • 如果它真的挂起(没有错误),可能是客户端有错误,然后你应该看看这个问题:stackoverflow.com/q/21468137/885318

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


【解决方案1】:

您可能在调用堆栈中进一步调用了Task&lt;T&gt;.ResultTask.Wait。这将cause a deadlock 我在我的博客上详细描述。

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

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

【讨论】:

  • 我通常不喜欢猜测答案这种类型的问题实际上总是由于同一个问题。
【解决方案2】:

我相信我面临的真正问题是 ServiceStack 框架。正如here 所讨论的那样。显然,直到 ServiceStack 4 才支持路由上的异步功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多