C #: поток.Сон не работает

#c# #multithreading #forms #audio

#c# #многопоточность #формы #Аудио

Вопрос:

У меня есть немного кода, который предназначен для отображения формы в течение определенного периода времени и воспроизведения звука. Однако форма остается открытой.

     static void Main(string[] args)
    {
        SoundPlayer sp = new SoundPlayer();
        ShowImage(@"ResourcesFish.png", "Fish", 256, 256, 1000);
        sp.SoundLocation = @"Resourcesfish.wav";
        sp.Play();

    }


    public static void ShowImage(string img, string title, int width, int height, int timeout)
    {
        ImageContainer ic = new ImageContainer();
        ic.imgView.Image = Image.FromFile(img);
        ic.Text = title;
        ic.Size = ic.imgView.Image.Size;
        ic.Height = height;
        ic.Width = width;
        ic.ShowDialog();
        Thread.Sleep(timeout);
        ic.Hide();
        ic.Opacity = 0;
        ic.Dispose();
    }
  

Он просто остается с открытой формой, не закрывается и не скрывается.
ImageContainer — это форма с полем изображения, называемым imgView.
Мне нужно, чтобы время ожидания истекло на 1 секунду, прежде чем оно закроется.

Комментарии:

1. Вызов ShowDialog() ожидает, пока вы закроете окно. Вам понадобится таймер, обработчик событий Tick которого вызывает метод Close() . Для чего требуется вызвать Application.Run() . У вас могут возникнуть проблемы с таким кодом, вам нужно прочитать книгу.

Ответ №1:

Строка:

 ic.ShowDialog();
  

Вызывает отображение формы модальным способом, так что метод блокируется и предотвращает выполнение всего остального до тех пор, пока форма не закроется.

Измените эту строку на:

 ic.Show();
  

Это немодальный, и остальная часть метода завершится.

Ответ №2:

ShowDialog() является модальным и никогда не возвращается, пока вы не закроете диалоговое окно. Вы хотите Show() , а также, вероятно, хотите отправить сообщение таймера самому себе вместо того, чтобы спать.

Вот пример кода:

http://www.codeproject.com/KB/cs/A_Custom_Message_Box.aspx

Ответ №3:

Режим сна никогда не вызывается при вызове showdialog() формы, что заставляет вызывающий поток ждать, пока код в форме не закроет окно. закройте окно с кодом в вашей форме, и все будет работать так, как вы ожидаете.