各位大侠帮忙看看这段代码到底有什么问题啊,这是利用语音识别,然后命令匹配,来生成一个播放列表的TabPage,每次运行都没有出现错误提醒,但运行的时候程序总是崩溃,悲剧啊!
    //创建播放列表
        private void createPlaylists()
        {
            /*
            int i = PlayLists.Items.Count+1;
            countOfPlaylists = i;
            PlayLists.Items.Add("播放列表" + countOfPlaylists);
             */
            Control.CheckForIllegalCrossThreadCalls = false; 
            TabPage tabPageAdded;
            bool LastIndex = true;
            int i = 1;
            for(i=1;i<TabControl.TabPages.Count;i++)
            {
                if (TabControl.TabPages[i].Text != "播放列表" + i)
                {
                    LastIndex = false;
                    break;
                }
            }
            if(LastIndex == true)
            {
                indexOfFileToBeAdded = TabControl.TabPages.Count;
                tabPageAdded = new TabPage("播放列表"+indexOfFileToBeAdded);
                TabControl.TabPages.Add(tabPageAdded);
            }
            else
            {
                indexOfFileToBeAdded = i;
                tabPageAdded = new TabPage("播放列表"+indexOfFileToBeAdded);
                TabControl.TabPages.Add(tabPageAdded);
            }
            try
            {
                FileStream fs = new FileStream(@"F:\我们的歌\播放列表" + indexOfFileToBeAdded + ".txt", FileMode.OpenOrCreate);
            }
            catch(IOException e)
            {
                new SpeechSynthesizer().Speak("IO异常发生了");
            }
            tabPageAdded.Text = "播放列表" + indexOfFileToBeAdded;
            new SpeechSynthesizer().Speak("播放列表" + indexOfFileToBeAdded + "创建成功");
            //PlayLists.SelectedItem = "播放列表" + countOfPlaylists;
            TabControl.SelectedTab = tabPageAdded;
            indexOfFileToBeAdded++;
        }

解决方案 »

  1.   

    private void createPlaylists()
      {
    try
    {  /*
      int i = PlayLists.Items.Count+1;
      countOfPlaylists = i;
      PlayLists.Items.Add("播放列表" + countOfPlaylists);
      */
      Control.CheckForIllegalCrossThreadCalls = false;  
      TabPage tabPageAdded;
      bool LastIndex = true;
      int i = 1;
      for(i=1;i<TabControl.TabPages.Count;i++)
      {
      if (TabControl.TabPages[i].Text != "播放列表" + i)
      {
      LastIndex = false;
      break;
      }
      }
      if(LastIndex == true)
      {
      indexOfFileToBeAdded = TabControl.TabPages.Count;
      tabPageAdded = new TabPage("播放列表"+indexOfFileToBeAdded);
      TabControl.TabPages.Add(tabPageAdded);
      }
      else
      {
      indexOfFileToBeAdded = i;
      tabPageAdded = new TabPage("播放列表"+indexOfFileToBeAdded);
      TabControl.TabPages.Add(tabPageAdded);
      }
      try
      {
      FileStream fs = new FileStream(@"F:\我们的歌\播放列表" + indexOfFileToBeAdded + ".txt", FileMode.OpenOrCreate);
      }
      catch(IOException e)
      {
      new SpeechSynthesizer().Speak("IO异常发生了");
      }
      tabPageAdded.Text = "播放列表" + indexOfFileToBeAdded;
      new SpeechSynthesizer().Speak("播放列表" + indexOfFileToBeAdded + "创建成功");
      //PlayLists.SelectedItem = "播放列表" + countOfPlaylists;
      TabControl.SelectedTab = tabPageAdded;
      indexOfFileToBeAdded++;
      }}
    catch(Exception ee)
    {
    MessageBox.Show(ee.ToString());
    }TRY--CATCH全部代码都包起来,先看看是什么异常。
    然后单步调试
      

  2.   

    不要胡乱写try...catch。那样写一堆垃圾代码,等代码出了问题都无法定位问题。如果你的vs环境(debug模式)不能在出现异常时捕获断点,至少可以在应用程序层的最顶层可以记录日志。参见帖子:《子线程异常处理
      

  3.   

    经过调试,我发现程序主要在这一步出现了异常:
    if(LastIndex == true)
      {
      indexOfFileToBeAdded = TabControl.TabPages.Count;
      tabPageAdded = new TabPage("播放列表"+indexOfFileToBeAdded);
      TabControl.TabPages.Add(tabPageAdded);
      }
    TabControl.TabPages.Add(tabPageAdded);
    我把断点设置在这一行的下面时,运行到断点处,会发生ArgumentException
    异常,然后下面还附有一行:Controls created on one thread cannot be parented to a control on a different thread.
    不知道这是什么原因?