Rsa97 прав, но это не такая тривиальная задача для новичка (не новичек знает что такое потоки и не спрашивал бы)
можно сделать так весь код запихнуть в void DoScan()
далее в том месте где был код поставить Thread t = new Thread(DoScan);
t.Start();
но это не все, так будет ошибки при добавлении элемента в список, поэтому нужно заменить
if (reply.Status == IPStatus.Success) listBox1.Items.Add(str);
на
BeginInvoke(new MethodInvoker(delegate
{
if (reply.Status == IPStatus.Success) listBox1.Items.Add(str);
}));
тогда проблем не будет, т.к. этот код будет выполняться в основном потоке.