我正在使用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
答案 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}}