public TikAsyncLoadingThread CallCommandAsync(IEnumerable <string> commandRows, string tag, Action <ITikSentence> oneResponseCallback) { Guard.ArgumentNotNullOrEmptyString(tag, "tag"); commandRows = commandRows.Concat(new string[] { string.Format("{0}={1}", TikSpecialProperties.Tag, tag) }); lock (_writeLockObj) { WriteCommand(commandRows); } TikAsyncLoadingThread result = new TikAsyncLoadingThread(() => { try { ITikSentence sentence; do { sentence = GetOne(tag); try { oneResponseCallback(sentence); } catch { //Do not crash reading thread because of implementation error in called code } } while (!(sentence is ApiDoneSentence /*|| sentence is ApiTrapSentence*/ || sentence is ApiFatalSentence)); // read sentences via TryGetOne(wait) for TAG until !done or !fatal is returned //NOTE: Should be ended via !done or !trap+!done (called via Cancel() command for specific tag) } catch { //catch all exceptions from GetOne -> thread should end via !done read sentence //TODO: implement "timeoutException" for GetOne and cancell gracefully thraed if this exception happens } }); result.Start(); return(result); }
public TikAsyncLoadingThread CallCommandAsync(IEnumerable<string> commandRows, string tag, Action<ITikSentence> oneResponseCallback) { Guard.ArgumentNotNullOrEmptyString(tag, "tag"); commandRows = commandRows.Concat(new string[] { string.Format("{0}={1}", TikSpecialProperties.Tag, tag) }); lock (_writeLockObj) { WriteCommand(commandRows); } TikAsyncLoadingThread result = new TikAsyncLoadingThread(() => { try { ITikSentence sentence; do { sentence = GetOne(tag); try { oneResponseCallback(sentence); } catch { //Do not crash reading thread because of implementation error in called code } } while (!(sentence is ApiDoneSentence /*|| sentence is ApiTrapSentence*/ || sentence is ApiFatalSentence)); // read sentences via TryGetOne(wait) for TAG until !done or !fatal is returned //NOTE: Should be ended via !done or !trap+!done (called via Cancel() command for specific tag) } catch { //catch all exceptions from GetOne -> thread should end via !done read sentence //TODO: implement "timeoutException" for GetOne and cancell gracefully thraed if this exception happens } }); result.Start(); return result; }