“托管调试助手'RaceOnRCWCleanup'在”贾维斯“中发现了一个问题

时间:2015-01-17 02:52:25

标签: c# visual-studio-2013 artificial-intelligence

我在一些互联网资源的帮助下创建了以下程序来创建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)。

1 个答案:

答案 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;

这是内联事件处理程序而不是使用委托。