/// <summary> /// private scan method for a queue item /// </summary> /// <param name="scannerQueueObject"></param> private void Scan(ScannerQueueObject scannerQueueObject) { ScanCancellationToken.ThrowIfCancellationRequested(); try { using (var tcpClient = new TcpClient()) { var timeout = TimeSpan.FromSeconds(10); tcpClient.ReceiveTimeout = (int)timeout.TotalMilliseconds; tcpClient.SendTimeout = (int)timeout.TotalMilliseconds; var asyncResult = tcpClient.BeginConnect(scannerQueueObject.IPAddress.ToString(), scannerQueueObject.Port, null, null); var waitHandle = asyncResult.AsyncWaitHandle; try { if (!asyncResult.AsyncWaitHandle.WaitOne(timeout, false)) { tcpClient.Close(); scannerQueueObject.Status = PortStatus.Closed; } else { scannerQueueObject.Status = tcpClient.Connected ? PortStatus.Open : PortStatus.Closed; } tcpClient.EndConnect(asyncResult); } finally { waitHandle.Close(); } } } catch { scannerQueueObject.Status = PortStatus.Closed; } OnPortCheckCompleted?.Invoke(this, new PortCheckCompletedEventArgs { IPAddress = scannerQueueObject.IPAddress, Port = scannerQueueObject.Port, Status = scannerQueueObject.Status }); }
/// <summary> /// Creates and start a worker /// </summary> /// <param name="cancellationToken"></param> /// <returns></returns> private Task CreateWorker(CancellationToken cancellationToken) { return(Task.Factory.StartNew(() => { while (!ScannerQueues.IsEmpty && ScannerQueues.TryDequeue(out ScannerQueueObject scannerQueueObject)) { ScanCancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested(); Scan(scannerQueueObject); } if (ScannerQueues.IsEmpty) { OnFinished?.Invoke(this, new EventArgs { }); } }, ScanCancellationToken)); }