2013-09-05 45 views
6

私はここで何が起こっているのか分かりません。Twitter APIを使って認証します。このStackOverflowExceptionが表示されるのはなぜですか?

しかし、それはそれはツイッターに投稿すべきポイントに到達したとき、それが言うことStackOverflowExceptionをスロー:

An unhandled exception of type 'System.StackOverflowException' 
occurred in 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です。

編集:追加のコールスタックデータ

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

Post 'SendTweet'メソッド –

+7

Visual Studioでこれをデバッグできる場合は、* Call Stack *ウィンドウ(** Ctrl ** + ** C **、** D **)を開いて、答えはそこにあるはずです。おそらくメソッド 'a()'をもう一度(直接的または間接的に1つ以上の他のメソッドを通して)呼び出す 'a()'メソッドを呼び出します。 –

+0

@リチャードエヴァーありがとう!私は正直なことですが、そこから集めることはあまりありません。あなたはそれから何かを得ることができますか? – Frostytheswimmer

答えて

1

Aスタックオーバーフローは通常、あなたのプログラムが再帰的にお互いを呼び出す方法の無限ループに入ったことを意味します。このため

最も可能性の高い原因は次のとおりです。

  • 使用しているライブラリにバグがあります。コードが単純なので、ライブラリの作成者がテストでこのようなバグを見逃している可能性は低いですが、問題の原因となるパラメータ値を渡す可能性があります。さまざまなパラメータを使っていくつかの呼び出しを行って、呼び出す方法について具体的なものかどうかを調べることができます。

  • あなたが書いたが投稿されていないコードは、自分自身への再帰呼び出しを引き起こしています。これは、void a() { a(); }のようなケースではかなり明白ですが、非常に微妙なこともあります。イベントへの反応としてツイートを投稿しようとすると、ツイートを送信するとイベントが再度発生し、無限フィードバックループ。これを確認する最も簡単な方法は、SendTweet()行にブレークポイントを置き、ブレークポイントが2回以上ヒットしたかどうかを確認することです。そうであれば、リエントラントコールを削除する必要があります。これは、コールを行う前にイベントハンドラの登録を解除してから(または、後で再度登録する)、変数を使用してコールの処理を抑止するなどして行うことができます。この:

    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」プロジェクトを作成します。次に、ツイートするための実用的なソリューションがあることがわかります。作業用コードを元のアプリケーションに移行して、そこで動作するかどうかを確認できます。それでも動作しない場合は、あなたのアプリがあなたの「こんにちは世界」テストとは異なることをしていることが分かります。

3

私は同じ問題を抱えており解決できました。私にとっては、Twitterで、私は自分のアプリケーションに読み取りアクセス権を与えていただけなので、問題が発生しました。あなたのコードからツイートを書くには、あなたのアプリケーションをTwitterで読み書きできるように登録する必要があります。

これを行うには、まず私が使っていたTwitterアカウントからアプリケーションを取り消す必要がありました。次に、dev.twitterのアプリケーションを読み書き可能に変更しました。私は新しいアクセストークンを生成し、自分のコードからツイートを送信することができました。

希望に役立ちます。

1

私はこれに答えるためのアカウントを作りました。私はコメントするのに十分な "評判"がありませんが、グレッグBの答えは正しいものです。

あなたのアプリにツイートの投稿に必要な権限がない場合は、SendTweet(SendTweetOptions)メソッドを呼び出すとStackOverflowExceptionが発生します。

私のアカウントにhttps://dev.twitter.com/でログインし、設定の下で自分のアプリケーションの権限を更新してから、アカウントを再認証する(つまり、新しいトークンを生成する)ことで、同じ問題を修正しました。

関連する問題