1-) Programın yanıt vermiyorda kalması Thread.Sleep komutunun sorunlu olmasından kaynaklanmıyor, siz doğrudan GUI işlemlerini çalıştıran main threadı uyutuyorsunuz. Eğer bu komutu sağlıklı kullanmak istiyorsanız, yeni bir thread oluşturmalısınız ve o threadın çalıştırdığı fonksiyon içinde kullanmalısınız. Yada basitçe ekstra fonksiyon vs. tanımlamadan lambda expression ile şöyle birşey yapabilirsiniz.
new Thread(() => {
                // ayrı thread içinde çalıştıracağınız kodları buraya yazın..
            })
            {
                IsBackground = true
            }.Start();
2-) Try Catch kullanarak oluşan hataları yakalayıp, hataya göre program akışı değiştirebilirsiniz.