挣扎于意外的跨线程和停止

时间:2015-07-05 00:39:40

标签: c# multithreading audio naudio

我正在使用NAudio Library为我自己的音频播放器应用程序创建播放列表功能,并完成源代码。但是,在调试时, InvalidOperationException 发生了,它表示跨线程发生的异常。

因此,我在表单的构造函数中声明了 CheckForIllegalCrossThreadCalls = false 。例外没有发生,但程序在特定行停止。

我没有将我的应用程序规划为多线程应用程序,因此不会使用或声明任何多线程组件。但发生了跨线程异常,所以我现在非常尴尬。

这是frmMain的声明和构造函数:

        AudioFileReader _audioFileReader;
        IWavePlayer _waveOutDevice = new WaveOut();

        static int nowIndex = 0;
        static bool _paused = false;
        static bool _manual_stop = false;

    public frmMain()
    {
        InitializeComponent();

        this.listMusic.DragOver += new DragEventHandler(this.FileDragOver);
        this.listMusic.DragDrop += new DragEventHandler(this.FileDragDrop);
        this.listMusic.DoubleClick += new EventHandler(this.listDoubleClick);

        _waveOutDevice.PlaybackStopped += new EventHandler<StoppedEventArgs>(this.PlaybackStopped);
    }

以及发生跨线程异常的点。

    private void playMusic(int index)
    {
        if(_waveOutDevice.PlaybackState != PlaybackState.Stopped)
            stopMusic();

            _audioFileReader = new AudioFileReader(listMusic.Items[index].SubItems[0].Text); // Exception Occured
            getProperties(listMusic.Items[index].Text);

        _waveOutDevice.Init(_audioFileReader);
        _waveOutDevice.Play();

        btnPlayCtrl.Text = "II";
        nowIndex = index;
        _manual_stop = false;
    }

......当我宣布 CheckForIllegalCrossThreadCalls = false

时,这里停了下来
        _waveOutDevice.Init(_audioFileReader); //from foregone source code.

它只是让应用程序暂停,但是,它没有发生任何异常并暂停调试。当我暂停调试以分析它时,调试器指向此处。

    [STAThread]
    static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        if (args.Length > 0)
            Application.Run(new frmMain(args[1]));
        else
            Application.Run(new frmMain());
    } // Debugger Points Here

1 个答案:

答案 0 :(得分:1)

删除构建函数中的 private void playMusic(int index) { this.Invoke((MethodInvoker)delegate { if (_waveOutDevice.PlaybackState != PlaybackState.Stopped) stopMusic(); _audioFileReader = new AudioFileReader(listMusic.Items[index].SubItems[0].Text); _waveOutDevice.Init(_audioFileReader); _waveOutDevice.Play(); btnPlayCtrl.Text = "II"; nowIndex = index; _manual_stop = false; }); }

然后尝试将执行移回主UI线程,如下所示:

{{1}}