#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() , а также, вероятно, хотите отправить сообщение таймера самому себе вместо того, чтобы спать.
Вот пример кода:
Ответ №3:
Режим сна никогда не вызывается при вызове showdialog()
формы, что заставляет вызывающий поток ждать, пока код в форме не закроет окно. закройте окно с кодом в вашей форме, и все будет работать так, как вы ожидаете.