class BKAnalyzeMusic
        {
            public double totalTimeS;                     //the time of the whole mp3 file
            public int samplePerFrame;
            public int sampleRate;
            public int sumFrame;
            public IManualSplitterInstance IManualSplitter1;//ActiveX中导出的接口
        }        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            object var = new object[0];
            BKAnalyzeMusic bkam = (BKAnalyzeMusic)e.Argument;
            string str = "E:\\meidafiles\\tmm\\Side B.MP3";
            var = bkam.IManualSplitter1.InitToPlay(str, out bkam.totalTimeS, out bkam.samplePerFrame, out bkam.sampleRate, out bkam.sumFrame);//ActiveX中导出的接口中一个方法,读取文件信息,耗时比较长
           e.Result = var;
        }
当程序运行到 var = bkam.IManualSplitter1.InitToPlay(str, out bkam.totalTimeS, out bkam.samplePerFrame, out bkam.sampleRate, out bkam.sumFrame)时,应用程序的UI仍旧会Frozen,请高手指教!

解决方案 »

  1.   

    关键问题是你需要在background线程调用backgroundWorker_DoWork,如果你在UI线程调用,那当然会阻塞
      

  2.   

    private void OnOpenfileClicked(object sender, System.Windows.RoutedEventArgs e)
    {                BKAnalyzeMusic bkam = new BKAnalyzeMusic();
                    bkam.IManualSplitter1 = m_IManualSplitter;
                    backgroundWorker.RunWorkerAsync(bkam);
    }       private void backgroundWorker_RunWorkerCompleted( object sender, RunWorkerCompletedEventArgs e )
            {
                if( e.Error != null )
                {
                   // MessageBox.Show(e.Error.Message, "An Error OCcurred");
                }
                else
                {
                    
                    object[] objresult = e.Result as object[];
                    foreach (object v in objresult)
                    {
                       short raInt = (short)v;
                       m_WaveData.Add(raInt);
                    }                  }
            }
    多谢你的回复!
    附上完整的代码,我是在一个按钮的Click事件中启动backgroundworker的,我将var = bkam.IManualSplitter1.InitToPlay(str, out bkam.totalTimeS, out bkam.samplePerFrame, out bkam.sampleRate, out bkam.sumFrame)换成Thread.Sleep(8000),UI都会正常响应,就是搞不懂为什么InitToPlay不行!
      

  3.   

    参考:
    http://blogs.msdn.com/delay/archive/2009/04/08/nobody-likes-seeing-the-hourglass-keep-your-application-responsive-with-backgroundtaskmanager-on-wpf-and-silverlight.aspx如果有楼主是MVVM方式的话,还得同步一下UI显示.
      

  4.   

    多谢你提供资料!
    我这里没有使用MVVM方式,按照你给的链接的方式设计的代码,还是会在InitToPlay时UI没有响应,换成Thread.Sleep(8000)没有问题,补充下:InitToPlay是用VC编写的ActiveX中的一个方法,遍历一首MP3,获取音乐信息,耗时比较长,会不会托管代码使用非托管dll时有什么限制呢?第一次这样使用,很是菜鸟!望高手继续指教!
      

  5.   

    换了C#中的好多种多线程方式都没办法解决,最后我在ActiveX中是用多线程,同时通过ConnectionPoints进行回调的方式来做了,现在结贴了,感谢各位的热心回复!