Twitterizerメモ – 非同期処理

Twitterizeで用意されているクラスには、

  • OAuthUtility ・・・ 認証系
  • TwitterUser ・・・ ユーザ情報系
  • TwitterStatus ・・・ ステータス処理系
  • TwitterDirectMessage ・・・ ダイレクトメッセージ処理系
  • TwitterList  ・・・ リスト機能系
  • TwitterSearch ・・・ 検索処理系
  • TwitterFriendship ・・・ 各種フォロワーの情報系
  • TwitterFavorite ・・・ Favorite機能系
  • TwitterTimeline ・・・ タイムライン取得系
が存在するみたいです(参考:[C#]TwitterクライアントライブラリはTwitterizerがイイみたいおちラボ)
今は、その中の
  • OAuthUtility
  • TwitterTimeline
  • TwitterStatus
の三つを使ってクライアントを作っています。
スポンサードリンク

OAuthUtilityについては、この記事を参照してもらうとして・・・。
現段階では、前回も触れたとおりTL取得とツイートの投稿が出来ています。
さて、前回の記事ではまったことがあったと記事にしましたが、そこにも出てきたTL取得のコード・・・
TwitterResponse<TwitterStatusCollection> tl = TwitterTimeline.HomeTimeline(tokens);
  ListViewItem lti;
  listView1.Items.Clear();
  foreach (TwitterStatus tweet in tl.ResponseObject)
  {
      lti = listView1.Items.Add(tweet.User.Name);
      lti.SubItems.Add(tweet.Text);
   }
これですね。
それと、ツイート投稿のコード。これは・・・
string tweet = "ツイート内容";
TwitterResponse<TwitterStatus> tweetResponse = TwitterStatus.Update(tokens, tweet);
とすることで投稿できます。

tokensという変数は、OAuthTokenというクラスで初期化してあるインスタンス変数です。
TwitterizerではOAuthTokenクラスにトークンを渡し、それを使ってAPIを実行するみたいです。
//インスタンス作成
OAuthTokens tokens = new OAuthTokens();

//値を渡す
tokens.ConsumerKey = "Your Consumerkey";
tokens.ConsumerSecret = "Your Consumersecret";
tokens.AccessToken = "Your AccessToken";
tokens.AccessTokenSecret = "Your AccessTokenSecret";
こんな具合に値を渡してやる。
この変数を引数として上述したクラスに渡してやれば、投稿・TL取得のAPIを実行することが出来ます

これで一応、投稿・TL取得は完了ですが、このままでは少し問題があります。
TL取得・ツイート投稿時に起こる問題として、実行中にUIがほんの数秒ですが固まります。
これは、同期処理をしているためで、処理が終わるのを待っている状態です。
自分で利用するなら、そんなこと考えなくても良いのですが、いざ公開するとなるとそれは他のユーザーにとってストレスになるかもしれません。

そこで非同期処理の出番です。
Twitterizerには、非同期処理でツイート投稿・TL取得をするクラスが用意されています。
そして、それを利用したサンプルコードが公式サイトでダウンロードできます。
そのコードを参考に書いてみたコードがこちら。
string tweet = "ツイート内容"

//ステータスラベルにポスト中の旨を表示
toolStripStatusLabel1.Text = "Posting...";

//ポストする際のオプション指定。ここではSSLを使用しないように設定。
StatusUpdateOptions option = new StatusUpdateOptions()
option.UseSSL = false;

//非同期処理
IAsyncResult aresult = TwitterStatusAsync.Update(tokens, tweet, option,new TimeSpan(0, 1, 0), res =>
{
    if (res.Result == RequestResult.Success)
    {
       BeginInvoke(new Action(() =>
       {
          toolStripStatusLabel1.Text = "PostingSuccess!"; //ラベルの表示を変更
         MessageBox.Show("投稿成功!", "確認", MessageBoxButtons.OK, MessageBoxIcon.None); //ダイアログを表示
        }));
     }
     else
     {
        BeginInvoke(new Action(() =>
        {
          toolStripStatusLabel1.Text = "Error!";
          MessageBox.Show("失敗したよ", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
         }));
      }
});
これはツイートをポストする例です。
IAsyncResult aresult = TwitterStatusAsync.Update(tokens, tweet, option,new TimeSpan(0, 1, 0), res =>{ });
の引数は左から順に、
  • トークン
  • ツイート内容
  • 投稿オプション
  • タイムアウトの時間
  • ラムダ式
となっています。
ラムダ式については、私はまだ初学者レベルなので詳しいことはわかりません。これから調べていくつもりです。

TimeSpanは時間を定義するクラスで、時、分、秒を定義できるみたいです(参考:TimeSpanオブジェクトを作成する、情報を取得するDOBON.NET)。
恐らく、これでタイムアウトまでの時間を定義していると考えられます。この例だと、1分でタイムアウトになる設定だと思います。

投稿オプションについては、引数を空欄にするとエラーが出たので設定しました。
オプションには、ジオタグなどが設定できるようです。ここでは、SSLの使用・不使用を設定しています。
あとの二つは省略。

IAsyncResultは、非同期操作のステータスを表すインターフェイスのようです(参考:IAsyncResult インターフェイスMSDN ライブラリ)。
現段階では、非同期のステータスを取得する必要がないので変数を使っていませんが、いずれは必要になってくるでしょうね。

TwitterStatusAsyncがTwitterizer側で用意されている非同期処理のクラスです。
ちなみに、「Async」は非同期を表しています。
このクラスは、Twitterのステータス・・・つまりツイートに関するクラスです。
これを使うことにより、ツイートを投稿したり、削除したりすることができます。

BeginInvokeは非同期処理を行うデリゲートというものです。
デリゲートもまだよくわからないので、追々調べていきます。現段階では、非同期処理を行うものとうことで。

こうすることで、UIが固まることなく処理できます。
間違ってボタンを2回押しちゃわないようにボタンを無効にする等の処理を入れるといいかもですね。

TLの取得が完了したので、次はアイコンを取得しツイートと共にリストビューに表示するということやってみようと思ってます。
では。

スポンサードリンク
Pocket

コメントを残す

メールアドレスが公開されることはありません。