public async Task <bool> StartStreamer(string twitterId, string clientId, string[] tracks) { var user = await _userDataManager.GetUserData(twitterId); if (user == null || tracks == null) { return(false); } var credentials = await _userDataManager.GetUserCredentials(twitterId); if (credentials == null || credentials.ValidUntil < DateTime.UtcNow) { //reroute for authentication } var userStream = new Models.TwitterUserStreams() { TwitterId = twitterId, ClientId = clientId, FilteredSteam = Tweetinvi.Stream.CreateFilteredStream(new Tweetinvi.Models.TwitterCredentials() { AccessToken = credentials.AccessToken, AccessTokenSecret = credentials.AccessTokenSecret, ConsumerKey = _twitterConfigurations.ConsumerKey, ConsumerSecret = _twitterConfigurations.ConsumerSecret, }) }; var processCancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = processCancellationTokenSource.Token; if (!(await _taskManager.TryUpdateClientStream(clientId, processCancellationTokenSource) == true)) { return(false); } foreach (var track in tracks) { userStream.FilteredSteam.AddTrack(track); } var newTask = Task.Run(() => { userStream.FilteredSteam.MatchingTweetReceived += (sender, args) => { if (cancellationToken.IsCancellationRequested) { userStream?.FilteredSteam?.StopStream(); userStream = null; } _signalRcontext.Clients.Client(clientId).SendAsync("GetStream", "Linus", args.Tweet.FullText); }; userStream.FilteredSteam.StartStreamMatchingAllConditionsAsync(); }, cancellationToken); userStreams.Add(userStream); return(true); }