2013-09-05 16 views
6

Ich bin mir nicht sicher, was hier vor sich geht, es authentifiziert sich mit der Twitter-API ganz gut.Warum erhalte ich diese StackOverflowException?

Aber wenn es auf den Punkt, wo es sollte twittern posten, wirft es ein StackOverflowException, der sagt:

An unhandled exception of type 'System.StackOverflowException' 
occurred in mscorlib.dll

ich ziemlich verwirrt bin. Der folgende Code führt zu der Ausnahme und verursacht diese.

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* 
    } 

Die verwendete Bibliothek ist TweetSharp.

Edit: Added Callstack Daten

mscorlib.dll!System.AppDomain.ExecuteAssembly(string assemblyFile, System.Security.Policy.Evidence assemblySecurity, string[] args) + 0x6b bytes 
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() + 0x27 bytes 
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(object state) + 0x6f bytes 
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) + 0xa7 bytes mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) + 0x16 bytes 
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x41 bytes  
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x44 bytes
+0

Beitrag 'SendTweet' Methode –

+7

Wenn Sie in der Lage sind, diese in Visual Studio zu debuggen, öffnen Sie die * Rufen Sie Stapel * Fenster (** Strg + ** ** C **, ** D **) und Sie die Antwort sollte genau dort sein. Sie haben wahrscheinlich die Methode 'a()' Aufrufmethode 'b()', die die Methode 'a()' erneut aufruft (entweder direkt oder indirekt über eine oder mehrere andere Methoden). –

+0

@RichardEv Danke dafür! Ich werde ehrlich sein, es gibt nicht viel _I_ kann davon sammeln. Kannst du etwas daraus machen? – Frostytheswimmer

Antwort

1

Ein Stapelüberlauf in der Regel bedeutet, dass das Programm in eine Endlosschleife von Methoden gegangen ist, die einander rekursiv aufrufen.

Die häufigsten Ursachen hierfür sind:

  • Es gibt einen Fehler in der Bibliothek Sie verwenden. Da Ihr Code einfach ist, scheint es unwahrscheinlich, dass der Autor Ihrer Bibliothek einen solchen Fehler in ihren Tests übersehen hat, aber es ist möglich, dass Sie einen Parameterwert übergeben, der ein Problem verursacht. Sie könnten versuchen, einige Anrufe mit verschiedenen Parametern zu machen, um zu sehen, ob es etwas Bestimmtes in Bezug darauf ist, wie Sie es anrufen.

  • Ein Code, den Sie geschrieben, aber nicht gepostet haben, verursacht einen rekursiven Aufruf an sich. Das kann in Fällen wie: void a() { a(); } ganz offensichtlich sein, aber es kann auch sehr subtil sein - wenn Sie versuchen, einen Tweet als Reaktion auf ein Ereignis zu veröffentlichen, ist es durchaus möglich, dass das Senden des Tweets das Ereignis erneut auslöst, was zu einem unendliche Rückkopplungsschleife. Dies überprüfen Sie am einfachsten, indem Sie einen Breakpoint auf Ihre SendTweet() -Zeile setzen und prüfen, ob der Breakpoint mehr als einmal getroffen wurde. Wenn dies der Fall ist, müssen Sie den Re-entrant-Aufruf eliminieren - dies kann geschehen, indem Sie den Ereignishandler vor dem Anruf abmelden (und ihn später erneut registrieren) oder eine Variable verwenden, um die Verarbeitung des Anrufs zu unterdrücken, z dies:

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

Wenn keines dieser Dinge hilft, dann versuchen, das Problem zu isolieren. Erstelle ein neues "Hallo Welt" -Projekt, das nur einen Tweet sendet und sonst nichts. Dann werden Sie wissen, dass Sie eine funktionierende Lösung zum Tweeten haben, und Sie können den Arbeitscode in Ihre ursprüngliche App migrieren, um zu sehen, ob sie dort funktioniert. Wenn es immer noch nicht funktioniert, wissen Sie, dass Ihre App anders ist als Ihr "Hallo Welt" -Test.

3

Ich hatte das gleiche Problem und konnte es lösen. Das Problem trat bei mir auf, weil ich auf Twitter nur meine Anwendung Lesezugriff erhalten hatte. Um einen Tweet aus Ihrem Code zu schreiben, muss Ihre Anwendung als Lese-/Schreibzugriff auf Twitter registriert sein.

Um dies zu tun, musste ich zuerst die Anwendung von dem Twitter-Konto, mit dem ich es verwendete, widerrufen. Dann habe ich die Anwendung auf dev.twitter so geändert, dass sie gelesen/geschrieben wurde. Ich habe dann ein neues Zugriffs-Token generiert und konnte Tweets aus meinem Code senden.

Hoffe, dass hilft.

1

Ich habe ein Konto, um dies zu beantworten, und ich habe nicht genug "Ruf" zu kommentieren, aber Greg B ist die richtige Antwort.

Wenn Ihre App Tweets nicht über die erforderlichen Berechtigungen zu schreiben, wird in einem Stackoverflow führen die SendTweet (SendTweetOptions) -Methode aufrufen.

Ich habe gerade das gleiche Problem behoben, indem ich mich unter https://dev.twitter.com/ bei meinem Konto anmelde und meine App-Berechtigungen unter Einstellungen aktualisiere und dann mein Konto erneut authentifiziere (dh ein neues Token generiere).

Verwandte Themen