private async Task HandlePackets() { while (!m_bShutDown) { BbTcpPacket packet; try { packet = await m_receivedPackets.ReceiveAsync(m_CancelToken.Token); } catch (OperationCanceledException) { break; } lock (m_liExpectedAnswers) { m_liExpectedAnswers.RemoveAll(x => x.GetExpectedAnswer() == packet.Opcode); } m_swLastAliveSign.Start(); await HandlePacket(packet); } }
public async Task <bool> StartScreenCappingAsync() { if (m_taskScreenCap != null && m_taskScreenCap.Status == TaskStatus.Running && !m_screenCapCancelToken.IsCancellationRequested) { return(true); } if (m_screenCapCancelToken != null) { m_screenCapCancelToken.Dispose(); } m_screenCapCancelToken = new CancellationTokenSource(); if (!await GetIsADBReadyAsync(GetAdbLocation(), m_screenCapCancelToken.Token)) { Log.w(TAG, "Unable to capture screens from ADB. See the Debug Log for details", true); return(false); } // get one screen to test if it works out and so that the layout can be adjusted once this function returns BitmapImage first = await Task.Run(async() => await GetADBScreenCapAsync(GetAdbLocation(), m_screenCapCancelToken.Token, false)); if (first == null) { first = await Task.Run(async() => await GetADBScreenCapAsync(GetAdbLocation(), m_screenCapCancelToken.Token, true)); if (first == null) { Log.w(TAG, "Unable to capture screens from ADB. See the Debug Log for details", true); return(false); } m_bScreenCapFallbackMethod = true; Log.w(TAG, "Preferred ADB screen capture method not supported (either local or remote ADB too old), using fallback", true); } else { m_bScreenCapFallbackMethod = false; } CurrentScreenCap = first; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("CurrentScreenCap")); m_swLastScreenCapUpdate.Start(); IsScreenCapOutOfDate = false; IsScreenCapActive = true; m_taskScreenCap = Task.Run(async() => { while (!m_screenCapCancelToken.IsCancellationRequested) { BitmapImage newCap = await GetADBScreenCapAsync(GetAdbLocation(), m_screenCapCancelToken.Token, m_bScreenCapFallbackMethod); if (newCap != null) { CurrentScreenCap = newCap; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("CurrentScreenCap")); m_swLastScreenCapUpdate.Start(); IsScreenCapOutOfDate = false; await Task.Delay(Properties.Settings.Default.ScreenCapRefresh, m_screenCapCancelToken.Token); } else { m_screenCapCancelToken.Token.ThrowIfCancellationRequested(); IsScreenCapOutOfDate = true; while (!await GetIsADBReadyAsync(GetAdbLocation(), m_screenCapCancelToken.Token) && !m_screenCapCancelToken.IsCancellationRequested) { await Task.Delay(5000, m_screenCapCancelToken.Token); } } while (IsScreenCapPaused && !m_screenCapCancelToken.IsCancellationRequested) { if (m_swLastScreenCapUpdate.ElapsedMilliseconds > Properties.Settings.Default.ScreenCapRefresh * 2) { IsScreenCapOutOfDate = true; } await Task.Delay(250, m_screenCapCancelToken.Token); } } }); Log.i(TAG, "Screen capture successfully started", true); return(true); }