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,请高手指教!
{
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,请高手指教!
解决方案 »
- Winform中,SaveFileDialog保存文件的时候为什么不能新建
- c#中如何判断字符串中只存在数字或字母??
- 必须声明标量变量“@userName”
- MDI子窗体刷新的问题
- 用smpmail发送邮件的问题?
- 怎么样用C#获取硬盘序列号,和MAC地址?
- 按值传送值类型,按引用传送值类型,按值传送引用类型,按引用传送引用类型
- 聊天窗口发送表情功能
- 花了三小时,用C#写了个屏幕取词的算法!(有兴趣一起来讨论一下)
- 新手求助 C#关于调用C++的DLL 头文件。h等问题
- 继承TextBox自定义DataGridView列输入数据后怎样在离开焦点时提交,而不是每输一个字母就提交。
- c# 文本框中只允许输入半角数字
{ 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不行!
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显示.
我这里没有使用MVVM方式,按照你给的链接的方式设计的代码,还是会在InitToPlay时UI没有响应,换成Thread.Sleep(8000)没有问题,补充下:InitToPlay是用VC编写的ActiveX中的一个方法,遍历一首MP3,获取音乐信息,耗时比较长,会不会托管代码使用非托管dll时有什么限制呢?第一次这样使用,很是菜鸟!望高手继续指教!