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.