/// <summary> /// 传入一段信息到语音中读出来 /// </summary> /// <param name="mess">自定义信息</param> public void Messagebaohao(string mess) { SpeechVoiceSpeakFlags Speak = SpeechVoiceSpeakFlags.SVSFNLPSpeakPunc; SpVoice Voice = new SpVoice(); ThreadPool.QueueUserWorkItem(_ => Voice.Speak(mess, Speak)); //=>新的匿名委托 }
改成这样试试,理论上应该是可以的。
public void Messagebaohao(string mess) { SpeechVoiceSpeakFlags Speak = SpeechVoiceSpeakFlags.SVSFNLPSpeakPunc; SpVoice Voice = new SpVoice(); new Thread(() => Voice.Speak(mess, Speak)).Start(); }
如果还不可以,建议你把SpVoice类的定义贴出来看看,尤其是它的Speak方法,可能这个方法实现的时候限制了单线程调用。
可不可以只给这个方法开一个线程,就是用一个线程去读数据,主线程处理事件,调用这个方法的同时不影响其它的操作就可已了,这样会不会比线程池好用点呢??
@木木学习: 可以的。你可以设计一个VoiceManager类,这个类里有个队列,里面是你要传入Speak方法的数据。在其他任何地方你想要读出声音来,只要往这个队列里插入数据就可以了。这是典型的多线程生产,单线程消费的模式。
@水牛刀刀: 不是太明白~~~~你能不能给我参考下相关的代码呢?
@木木学习:
异常来自 HRESULT:0x80045006
那个线程池的在多次调用的时候会报异常呢~~~
@木木学习: 贴SpVoice类的代码
@水牛刀刀: 那个貌似可以用循环解决掉,但是不知道怎么去循环!!!
目测是封装了
SpeechVoice com组件 线程池抛异常正常
问题解决了么,我也遇到这个问题了,求指教
嗯,忘记把第三方控件发给别人了!