01647

ustreamer-01647

CoreTweet.Streamingに関する文献

作法

  • Nugetパッケージ
    • CoreTweet
    • CoreTweet.Streaming.Reactive
  • using
    • CoreTweet;
    • CoreTweet.Streaming;
    • CoreTweet.Streaming.Reactive;
    • System.Reactive.Linq;
    • System.Threading.Tasks;

リンク先で提示されているサンプルソース

// using System;
// using System.Reactive.Linq;
// using System.Threading.Tasks;
// using CoreTweet;
// using CoreTweet.Streaming;
// using CoreTweet.Streaming.Reactive;

var stream = t.Streaming.StartObservableStream(StreamingType.User).Publish();

stream.OfType<FriendsMessage>()
    .Subscribe(x => Console.WriteLine("フォロー中: " + string.Join(", ", x)));

stream.OfType<StatusMessage>()
    .Subscribe(x => Console.WriteLine("{0}: {1}", x.Status.User.ScreenName, x.Status.Text));

var disposable = stream.Connect();

await Task.Delay(30 * 1000);
disposable.Dispose();
ストリーミング API を使う · CoreTweet/CoreTweet Wiki · GitHub

ぼくのかんがえたそーすはえらーおちする

stream.OfType().Subscribe()でこける.

型 'System.InvalidOperationException' の例外が WindowsBase.dll で発生しましたが、ユーザー コード内ではハンドルされませんでした

追加情報:このオブジェクトは別のスレッドに所有されているため、呼び出しスレッドはこのオブジェクトにアクセスできません。

この例外のハンドラーがある場合は、プログラムを安全に続行できます。

private void startUserStream_Click(object sender, RoutedEventArgs e)
{
    viewTextBox.Clear();
    try
    {
        var stream = tokens.Streaming.StartObservableStream(CoreTweet.Streaming.StreamingType.User).Publish();
        disposable = stream.Connect();
        stream.OfType<StatusMessage>().Subscribe(x => viewTextBox.AppendText(
            string.Format("{0}: {1}{2}"
                    , x.Status.User.ScreenName
                    , x.Status.Text
                    , Environment.NewLine)));
    }
    catch (Exception ex)
    {
        viewTextBox.AppendText(ex.Message);
    }

}

private void stopUserStream_Click(object sender, RoutedEventArgs e)
{
    try
    {
        disposable.Dispose();
    }
    catch (Exception ex)
    {
        viewTextBox.AppendText(ex.Message);
    }
}

f:id:paulga:20141018102242p:plain

後日談(2014年10月19日)

解決した.Reactive Extensionsについて学べば良かった.

場当たり的には,いくつかのページで共通するそれらしいコードを入れて打開できる.

.ObserveOn(SynchronizationContext.Current)
Rx入門 (22) – TwitterのTimelineを表示 | xin9le.net

Sync... の所属を調べてusingに追加した.SynchronizationContext クラス (System.Threading)

using using System.Threading;

このObserveOnね - img.ly

private void startUserStream_Click(object sender, RoutedEventArgs e)
{
    viewTextBox.Clear();
    try
    {
        connectable = tokens.Streaming.StartObservableStream(StreamingType.User).Publish();
        connectable.OfType<StatusMessage>()
            .Select(m => m.Status)
            .ObserveOn(SynchronizationContext.Current)
            .Subscribe(status => viewTextBox.AppendText(string.Format("{0}: {1}{2}"
                            , status.User.ScreenName
                            , status.Text
                            , Environment.NewLine)));
        disposable = connectable.Connect();
    }
    catch (Exception ex)
    {
        viewTextBox.AppendText(ex.Message);
    }

}