当一个线程被杀死时如何杀死一个playloop?

时间:2013-08-14 01:24:56

标签: c# .net multithreading audio

见面线程:

    public void TimerFunc(){
        ...
        while (true)
        {
  ...
                sound.PlayLooping();
                // Displays the MessageBox and waits for user input
                MessageBox.Show(message, caption, buttons);
                // End the sound loop
                sound.Stop();
 ...

        }
    }

线程由主界面中的按钮启动,并且可以被界面中的按钮杀死。

如果线程在等待用户输入时被杀死,我如何让soundloop停止?

1 个答案:

答案 0 :(得分:1)

你不要杀死线程。如果线程被杀死,它就无法做任何事情。

礼貌地向帖子发送消息,要求它停止播放。

private volatile bool canContinue = true;

public void TimerFunc(){
    ...
    while (true && canContinue)
    {
        ...
        sound.PlayLooping();
        // Displays the MessageBox and waits for user input
        MessageBox.Show(message, caption, buttons);
        // End the sound loop
        sound.Stop();
        ...
    }
}

public void StopPolitely()
{
    canContinue = false;
}

主界面上的按钮将只调用thread.StopPolitely()并以干净的方式终止线程。 如果您希望它更快地终止,您可以考虑其他更积极的解决方案,例如更频繁地检查canContinue,或使用Thread.Interrupt()唤醒线程,即使它在阻塞呼叫中忙碌(但随后你必须管理中断) 因为它只是一个bool,它是单作者/单读者,你甚至可以避免将其声明为volatile,即使你应该这样做。