6

我不确定这里发生了什么,它可以通过 Twitter API 进行身份验证。

但是当它到达应该发布到推特的地步时,它会抛出一个StackOverflowException说:

“System.StackOverflowException”类型的未处理异常
发生在 mscorlib.dll 中

我很困惑。下面的代码是导致并最终导致异常的原因。

    void StartValidation()
    {
        Console.Clear();
        //Start Status thread
        var status = TextAndUi.GetStatisThread();
        status.Start("Validating");

        //Check for Messages
        var tweetAndSenderData = Imap.GetUnreadMessageAndSender();

        if (tweetAndSenderData != null)
        {
            //Authurize connection and app
            var authenticate = new Authenticate();
            var tweetApp = authenticate.CreateClient();

            //End thread
            status.Abort();
            Console.WriteLine("Validated!");
            Console.Clear();

            //Post tweets
            PostContent("test", tweetApp);

            //Delete messages
            Imap.DeleteMessages();
        }
        else
        {
            //End thread
            status.Abort();
            TextAndUi.ShowSomethingToTheUser("The box is empty, or TTT could not secure a connection", true);
        }
    }

    void PostContent(string myTweet, TwitterService tweetApp)
    {
        if (TextAndUi.MessageIsSuitableLength(myTweet))
        {
                PostTweet(tweetApp, myTweet);
        }
    }

    void PostTweet(TwitterService tweetApp, string tweet )
    {
        var tweetOptions = new SendTweetOptions() {Status = tweet};

        tweetApp.SendTweet(tweetOptions); /*The line that throws the exception*
    }

正在使用的库是 TweetSharp。

编辑:添加了 CallStack 数据

mscorlib.dll!System.AppDomain.ExecuteAssembly(string assemblyFile, System.Security.Policy.Evidence assemblySecurity, string[] args) + 0x6b 字节   
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() + 0x27 字节  
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(对象状态)+ 0x6f 字节   
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调, 对象状态, bool preserveSyncCtx) + 0xa7 字节 mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading .ExecutionContext executionContext, System.Threading.ContextCallback 回调, 对象状态, bool preserveSyncCtx) + 0x16 bytes
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调, 对象状态) + 0x41 字节    
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x44 字节   
4

3 回答 3

3

我有同样的问题并且能够解决它。对我来说,问题的出现是因为在 Twitter 上,我只给了我的应用程序读取权限。要从您的代码中编写推文,您的应用程序必须在推特上注册为读/写。

为此,我必须首先从我使用它的 twitter 帐户中撤销该应用程序。然后,我更改了 dev.twitter 上的应用程序,使其可以读/写。然后我生成了一个新的访问令牌,并且能够从我的代码中发送推文。

希望有帮助。

于 2013-12-02T14:06:49.883 回答
1

我注册了一个帐户来回答这个问题,我没有足够的“声誉”来发表评论,但 Greg B 的答案是正确的。

如果您的应用没有发布推文所需的权限,则调用 SendTweet(SendTweetOptions) 方法将导致 StackOverflowException。

我刚刚通过在https://dev.twitter.com/登录我的帐户并在设置下更新我的应用程序权限,然后重新验证我的帐户(即生成新令牌)来解决了同样的问题。

于 2014-01-06T15:42:52.507 回答
1

堆栈溢出通常意味着您的程序已进入递归调用彼此的方法的无限循环。

最可能的原因是:

  • 您正在使用的库中存在错误。由于您的代码很简单,您的库的作者似乎不太可能在他们的测试中错过这样的错误,但您可能传递了一个导致问题的参数值。您可以尝试使用不同的参数进行一些调用,以查看它是否与您调用它的方式有关。

  • 您编写但未发布的某些代码会导致对其自身的递归调用。这在以下情况下可能非常明显:void a() { a(); }但它也可能非常微妙 - 如果您尝试发布推文作为对事件的反应,发送推文很可能会导致事件再次引发,从而导致无限反馈回路。检查这一点的最简单方法是在您的 SendTweet() 行上放置一个断点,并检查该断点是否被多次击中。如果是,那么您需要消除重入调用 - 这可以通过在进行调用之前取消注册事件处理程序(并在之后再次重新注册)或使用变量来抑制您对调用的处理来完成,例如这个:

    bool mSuppressTweets;
    
    void PostTweet(TwitterService tweetApp, string tweet )
    {
        if (mSuppressTweets)
            return;
    
        var tweetOptions = new SendTweetOptions() {Status = tweet};
    
        mSuppressTweets = true;
        tweetApp.SendTweet(tweetOptions);
        mSuppressTweets = false;
    }
    

如果这些事情都没有帮助,那么请尝试隔离问题。创建一个新的“hello world”项目,它只发送一条推文,没有别的。然后你就会知道你有一个可行的推文解决方案,你可以将工作代码迁移到你的原始应用程序中,看看它是否在那里工作。如果它仍然不起作用,您知道这是您的应用程序所做的与您的“hello world”测试不同的事情。

于 2013-09-05T20:14:46.637 回答