static async Task DoControlStreamAsync(TwitterContext twitterCtx) { var evt = new ManualResetEventSlim(false); string streamID = string.Empty; await Task.Run(async() => { Console.WriteLine("\nStreamed Content: \n"); int count = 0; var cancelTokenSrc = new CancellationTokenSource(); try { await (from strm in twitterCtx.Streaming where strm.Type == StreamingType.Site && strm.Follow == "15411837,16761255" select strm) .WithCancellation(cancelTokenSrc.Token) .StartAsync(async strm => { if (string.IsNullOrEmpty(strm.Content)) { Console.WriteLine("Keep-Alive"); } else { await HandleStreamResponse(strm); } if (strm.EntityType == StreamEntityType.Control) { var control = strm.Entity as Control; streamID = control.URL.Replace("/1.1/site/c/", ""); evt.Set(); } if (count++ == 25) { cancelTokenSrc.Cancel(); } }); } catch (IOException ex) { // Twitter might have closed the stream, // which they do sometimes. You should // restart the stream, but be sure to // read Twitter documentation on stream // back-off strategies to prevent your // app from being blocked. Console.WriteLine(ex.ToString()); } catch (OperationCanceledException) { Console.WriteLine("Stream cancelled."); } }); evt.Wait(); Console.WriteLine("Follower Details:\n"); var ctrlStrmFollowers = await (from strm in twitterCtx.ControlStream where strm.Type == ControlStreamType.Followers && strm.UserID == 15411837 && strm.StreamID == streamID select strm) .SingleOrDefaultAsync(); if (ctrlStrmFollowers != null) { ControlStreamFollow follow = ctrlStrmFollowers.Follow; ControlStreamUser followUser = follow.User; List <ulong> friends = follow.Friends; Cursors cursors = follow.Cursors; Console.WriteLine("User ID: " + followUser.UserID); Console.WriteLine("User Name: " + followUser.Name); Console.WriteLine("Can DM: " + followUser.DM); friends.ForEach(friend => Console.WriteLine(friend)); Console.WriteLine("Prev Cursor: " + cursors.Previous); Console.WriteLine("Next Cursor: " + cursors.Next); Console.WriteLine("Info Details:\n"); } var ctrlStrmInfo = (from strm in twitterCtx.ControlStream where strm.Type == ControlStreamType.Info && strm.StreamID == streamID select strm) .SingleOrDefault(); if (ctrlStrmInfo != null) { ControlStreamInfo infoUser = ctrlStrmInfo.Info; ControlStreamUser user = infoUser.Users.First(); Console.WriteLine("User ID: " + user.UserID); Console.WriteLine("User Name: " + user.Name); Console.WriteLine("Can DM: " + user.DM); Console.WriteLine("Delimited: " + infoUser.Delimited); Console.WriteLine("Include Followings Acitity: " + infoUser.IncludeFollowingsActivity); Console.WriteLine("Include User Changes: " + infoUser.IncludeUserChanges); Console.WriteLine("Replies: " + infoUser.Replies); Console.WriteLine("With: " + infoUser.With); Console.WriteLine("\nInitial Stream Users: "); await PrintUserInfoAsync(twitterCtx, streamID); ControlStream csAdd = await twitterCtx.AddSiteStreamUserAsync(new List <ulong> { 16761255 }, streamID); Console.WriteLine("Command Response: " + csAdd.CommandResponse); Console.WriteLine("\nAfter Adding a User: "******"Command Response: " + csRemove.CommandResponse); Console.WriteLine("\nAfter Removing a User: "); await PrintUserInfoAsync(twitterCtx, streamID); } }