我在一些互联网资源的帮助下创建了以下程序来创建Jarvis:
namespace JarvisFile1
{
public partial class Form1 : Form
{
private void Form1_Load(object sender, EventArgs e)
{
_recognizer.SetInputToDefaultAudioDevice();
_recognizer.LoadGrammar(new Grammar(new GrammarBuilder(new Choices(File.ReadAllLines(@"C:\Users\Nelson\Documents\JarvisCommands\greetings.txt")))));
_recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(_recognizer_SpeechRecognized);
_recognizer.RecognizeAsync(RecognizeMode.Multiple);
}
SpeechRecognitionEngine _recognizer = new SpeechRecognitionEngine();
SpeechSynthesizer JARVIS = new SpeechSynthesizer();
string QEvent;
string ProcWindow;
double timer = 10;
int count = 1;
Random rnd = new Random();
public Form1()
{
InitializeComponent();
}
void _recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
int ranNum = rnd.Next(1, 10);
string speech = e.Result.Text;
switch (speech)
{
//GREETINGS
case "hello":
case "hello jarvis":
if (ranNum < 6) { JARVIS.Speak("Hello sir"); }
else if (ranNum > 5) { JARVIS.Speak("Hi"); }
break;
case "goodbye":
case "goodbye jarvis":
case "close":
case "close jarvis":
JARVIS.Speak("Until next time");
Close();
break;
case "jarvis":
if (ranNum < 5) { QEvent = ""; JARVIS.Speak("Yes sir"); }
else if (ranNum > 4) { QEvent = ""; JARVIS.Speak("Yes?"); }
break;
}
}
}
}
编译器首先完美地编译它,然后给出以下错误消息:
&#34;托管调试助手&#39; RaceOnRCWCleanup&#39;发现了一个问题 在&C; \ Users \ Nelson \ Documents \ Visual Studio中 2013 \项目\ JarvisFile1 \ JarvisFile1 \ BIN \调试\ JarvisFile1.vshost.exe&#39;
其他信息:已尝试释放RCW 正在使用中。 RCW正在活动线程或另一个线程上使用。 试图释放使用中的RCW会导致损坏或数据丢失。&#34;
我不太清楚这是什么意思,因为我是编码的初学者。 任何帮助解决这个问题将非常感激。如果需要,我可以提供更多调试日志。我正在使用Windows 8和visual studio 2013。
日志如下:
&#39; JarvisFile1.vshost.exe&#39; (CLR v4.0.30319:JarvisFile1.vshost.exe):已加载&#39; C:\ Windows \ Microsoft.Net \ assembly \ GAC_32 \ mscorlib \ v4.0_4.0.0.0__b77a5c561934e089 \ mscorlib.dll&#39;。无法找到或打开PDB文件。 &#39; JarvisFile1.vshost.exe&#39; (CLR v4.0.30319:JarvisFile1.vshost.exe):已加载&#39; C:\ Windows \ assembly \ GAC_MSIL \ Microsoft.VisualStudio.HostingProcess.Utilities \ 12.0.0.0__b03f5f7f11d50a3a \ Microsoft.VisualStudio.HostingProcess.Utilities.dll&# 39 ;.无法找到或打开PDB文件。 &#39; JarvisFile1.vshost.exe&#39; (CLR v4.0.30319:JarvisFile1.vshost.exe):已加载&#39; C:\ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System.Windows.Forms \ v4.0_4.0.0.0__b77a5c561934e089 \ System.Windows.Forms的.dll&#39 ;.无法找到或打开PDB文件。 &#39; JarvisFile1.vshost.exe&#39; (CLR v4.0.30319:JarvisFile1.vshost.exe):已加载&#39; C:\ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System.Drawing \ v4.0_4.0.0.0__b03f5f7f11d50a3a \ System.Drawing.dll&#39 ;。无法找到或打开PDB文件。 &#39; JarvisFile1.vshost.exe&#39; (CLR v4.0.30319:JarvisFile1.vshost.exe):已加载&#39; C:\ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System \ v4.0_4.0.0.0__b77a5c561934e089 \ System.dll&#39;。无法找到或打开PDB文件。 &#39; JarvisFile1.vshost.exe&#39; (CLR v4.0.30319:JarvisFile1.vshost.exe):已加载&#39; C:\ Windows \ assembly \ GAC_MSIL \ Microsoft.VisualStudio.HostingProcess.Utilities.Sync \ 12.0.0.0__b03f5f7f11d50a3a \ Microsoft.VisualStudio.HostingProcess.Utilities。 Sync.dll&#39 ;.无法找到或打开PDB文件。 &#39; JarvisFile1.vshost.exe&#39; (CLR v4.0.30319:JarvisFile1.vshost.exe):已加载&#39; C:\ Windows \ assembly \ GAC_MSIL \ Microsoft.VisualStudio.Debugger.Runtime \ 12.0.0.0__b03f5f7f11d50a3a \ Microsoft.VisualStudio.Debugger.Runtime.dll&# 39 ;. &#39; JarvisFile1.vshost.exe&#39; (CLR v4.0.30319:JarvisFile1.vshost.exe):已加载&#39; c:\ users \ nelson \ documents \ visual studio 2013 \ Projects \ JarvisFile1 \ JarvisFile1 \ bin \ Debug \ JarvisFile1.vshost.exe&#39;。无法找到或打开PDB文件。 &#39; JarvisFile1.vshost.exe&#39; (CLR v4.0.30319:JarvisFile1.vshost.exe):已加载&#39; C:\ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System.Core \ v4.0_4.0.0.0__b77a5c561934e089 \ System.Core.dll&#39 ;。无法找到或打开PDB文件。 &#39; JarvisFile1.vshost.exe&#39; (CLR v4.0.30319:JarvisFile1.vshost.exe):已加载&#39; C:\ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System.Xml.Linq \ v4.0_4.0.0.0__b77a5c561934e089 \ System.Xml.Linq的.dll&#39 ;.无法找到或打开PDB文件。 &#39; JarvisFile1.vshost.exe&#39; (CLR v4.0.30319:JarvisFile1.vshost.exe):已加载&#39; C:\ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System.Data.DataSetExtensions \ v4.0_4.0.0.0__b77a5c561934e089 \ System.Data.DataSetExtensions的.dll&#39 ;.无法找到或打开PDB文件。 &#39; JarvisFile1.vshost.exe&#39; (CLR v4.0.30319:JarvisFile1.vshost.exe):已加载&#39; C:\ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ Microsoft.CSharp \ v4.0_4.0.0.0__b03f5f7f11d50a3a \ Microsoft.CSharp.dll&#39 ;。无法找到或打开PDB文件。 &#39; JarvisFile1.vshost.exe&#39; (CLR v4.0.30319:JarvisFile1.vshost.exe):已加载&#39; C:\ Windows \ Microsoft.Net \ assembly \ GAC_32 \ System.Data \ v4.0_4.0.0.0__b77a5c561934e089 \ System.Data.dll&#39 ;。无法找到或打开PDB文件。 &#39; JarvisFile1.vshost.exe&#39; (CLR v4.0.30319:JarvisFile1.vshost.exe):已加载&#39; C:\ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System.Deployment \ v4.0_4.0.0.0__b03f5f7f11d50a3a \ System.Deployment.dll&#39 ;。无法找到或打开PDB文件。 &#39; JarvisFile1.vshost.exe&#39; (CLR v4.0.30319:JarvisFile1.vshost.exe):已加载&#39; C:\ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System.Xml \ v4.0_4.0.0.0__b77a5c561934e089 \ System.Xml.dll&#39 ;。无法找到或打开PDB文件。 &#39; JarvisFile1.vshost.exe&#39; (CLR v4.0.30319:JarvisFile1.vshost.exe):已加载&#39; C:\ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System.Speech \ v4.0_4.0.0.0__31bf3856ad364e35 \ System.Speech.dll&#39 ;。无法找到或打开PDB文件。 线程0x1cf4已退出代码259(0x103)。 线程0x11f8已退出代码259(0x103)。 线程0xd6c已退出,代码为0(0x0)。 线程0x23c已退出,代码为0(0x0)。 线程0x610已退出代码259(0x103)。 &#39; JarvisFile1.vshost.exe&#39; (CLR v4.0.30319:JarvisFile1.vshost.exe):已加载&c; \ users \ nelson \ documents \ visual studio 2013 \ Projects \ JarvisFile1 \ JarvisFile1 \ bin \ Debug \ JarvisFile1.exe&#39;。符号已加载。 &#39; JarvisFile1.vshost.exe&#39; (CLR v4.0.30319:JarvisFile1.vshost.exe):已加载&#39; C:\ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System.Configuration \ v4.0_4.0.0.0__b03f5f7f11d50a3a \ System.Configuration.dll&#39 ;。无法找到或打开PDB文件。 JarvisFile1.vshost.exe信息:0:SAPI不实现语音字母选择。 线程0x2270已退出,代码为259(0x103)。 线程0x1b8已退出代码259(0x103)。 线程0x1c2c已退出代码259(0x103)。 线程0x1650已退出,代码为259(0x103)。 程序&#39; [9444] JarvisFile1.vshost.exe:程序跟踪&#39;已退出代码0(0x0)。 程序&#39; [9444] JarvisFile1.vshost.exe&#39;已退出代码0(0x0)。
答案 0 :(得分:1)
看起来您需要释放或等到语音引擎资源空闲,直到您关闭表单为止。那个语音引擎可能有一个明确的调用来释放资源。只是一个猜测,但值得研究。
编辑:
取自MSDN网站
在释放对语音识别器的最后一个引用之前,请始终调用Dispose。否则,在垃圾收集器调用识别器对象的Finalize方法之前,不会释放它正在使用的资源。
您可以加入事件RecognizeCompleted,当您获得“停止”时。完成,在您的引擎上调用release,然后调用Close()
所以你需要代码:
.
.
case "close jarvis":
_recognizer.RecognizeCompleted += new EventHandler<RecognizeCompletedEventArgs>(_recognizer_RecognizeCompleted);
JARVIS.Speak("Until next time");
break;
.
.
void _recognizer_RecognizeCompleted(RecognizeCompletedEventArgs e)
{
_recognizer.Release();
Close();
]
由于您对编码不熟悉,我希望首先展示这种方式,因为您熟悉语法。但对你的情况更好的方法是:
case "close jarvis":
_recognizer.RecognizeCompleted += (e) => { Close(); }
JARVIS.Speak("Until next time");
break;
这是内联事件处理程序而不是使用委托。