【问题标题】:"Managed Debugging Assistant 'RaceOnRCWCleanup' has detected a p‌r‌o‌b‌l‌e‌m in " Jarvis“托管调试助手 'RaceOnRCWCleanup' 在 Jarvis 中检测到一个 p‌r‌o‌b‌l‌e‌m
【发布时间】:2015-01-17 02:52:25
【问题描述】:

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

编译器一开始编译完美,然后给出如下错误信息:

“托管调试助手 'RaceOnRCWCleanup' 检测到问题 在 'C:\Users\Nelson\Documents\Visual Studio 2013\Projects\JarvisFile1\JarvisFile1\bin\Debug\JarvisFile1.vshost.exe'。

附加信息:已尝试释放 RCW 正在使用中。 RCW 正在活动线程或其他线程上使用。 尝试释放正在使用的 RCW 可能会导致损坏或数据丢失。”

我不太确定这意味着什么,因为我是编码的初学者。 任何解决此问题的帮助将不胜感激。如果需要,我可以提供进一步的调试日志。我正在使用 Windows 8 和 Visual Studio 2013。

日志如下:

“JarvisFile1.vshost.exe”(CLR v4.0.30319:JarvisFile1.vshost.exe):已加载“C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib。 dll'。无法找到或打开 PDB 文件。 'JarvisFile1.vshost.exe' (CLR v4.0.30319: JarvisFile1.vshost.exe): 加载'C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities\12.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess。实用程序.dll'。无法找到或打开 PDB 文件。 'JarvisFile1.vshost.exe' (CLR v4.0.30319: JarvisFile1.vshost.exe): 加载'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System .Windows.Forms.dll'。无法找到或打开 PDB 文件。 'JarvisFile1.vshost.exe' (CLR v4.0.30319: JarvisFile1.vshost.exe): 加载'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing .dll'。无法找到或打开 PDB 文件。 “JarvisFile1.vshost.exe”(CLR v4.0.30319:JarvisFile1.vshost.exe):加载“C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll”。无法找到或打开 PDB 文件。 'JarvisFile1.vshost.exe' (CLR v4.0.30319: JarvisFile1.vshost.exe): 加载'C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities.Sync\12.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio。 HostingProcess.Utilities.Sync.dll'。无法找到或打开 PDB 文件。 'JarvisFile1.vshost.exe' (CLR v4.0.30319: JarvisFile1.vshost.exe): 加载'C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.Debugger.Runtime\12.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.Debugger。运行时.dll'。 'JarvisFile1.vshost.exe' (CLR v4.0.30319: JarvisFile1.vshost.exe): 加载'c:\users\nelson\documents\visual studio 2013\Projects\JarvisFile1\JarvisFile1\bin\Debug\JarvisFile1.vshost.exe '。无法找到或打开 PDB 文件。 'JarvisFile1.vshost.exe' (CLR v4.0.30319: JarvisFile1.vshost.exe): 加载'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core .dll'。无法找到或打开 PDB 文件。 'JarvisFile1.vshost.exe' (CLR v4.0.30319: JarvisFile1.vshost.exe): 加载'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml.Linq\v4.0_4.0.0.0__b77a5c561934e089\System .Xml.Linq.dll'。无法找到或打开 PDB 文件。 'JarvisFile1.vshost.exe' (CLR v4.0.30319: JarvisFile1.vshost.exe): 加载'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Data.DataSetExtensions\v4.0_4.0.0.0__b77a5c561934e089\System .Data.DataSetExtensions.dll'。无法找到或打开 PDB 文件。 'JarvisFile1.vshost.exe' (CLR v4.0.30319: JarvisFile1.vshost.exe): 加载'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.CSharp\v4.0_4.0.0.0__b03f5f7f11d50a3a\Microsoft.CSharp .dll'。无法找到或打开 PDB 文件。 'JarvisFile1.vshost.exe' (CLR v4.0.30319: JarvisFile1.vshost.exe): 加载'C:\Windows\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data .dll'。无法找到或打开 PDB 文件。 'JarvisFile1.vshost.exe' (CLR v4.0.30319: JarvisFile1.vshost.exe): 加载'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Deployment\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Deployment .dll'。无法找到或打开 PDB 文件。 'JarvisFile1.vshost.exe' (CLR v4.0.30319: JarvisFile1.vshost.exe): 加载'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml .dll'。无法找到或打开 PDB 文件。 'JarvisFile1.vshost.exe' (CLR v4.0.30319: JarvisFile1.vshost.exe): 加载'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Speech\v4.0_4.0.0.0__31bf3856ad364e35\System.Speech .dll'。无法找到或打开 PDB 文件。 线程 0x1cf4 已退出,代码为 259 (0x103)。 线程 0x11f8 已退出,代码为 259 (0x103)。 线程 0xd6c 以代码 0 (0x0) 退出。 线程 0x23c 以代码 0 (0x0) 退出。 线程 0x610 已退出,代码为 259 (0x103)。 'JarvisFile1.vshost.exe' (CLR v4.0.30319: JarvisFile1.vshost.exe): 加载'c:\users\nelson\documents\visual studio 2013\Projects\JarvisFile1\JarvisFile1\bin\Debug\JarvisFile1.exe'。已加载符号。 'JarvisFile1.vshost.exe' (CLR v4.0.30319: JarvisFile1.vshost.exe): 加载'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration .dll'。无法找到或打开 PDB 文件。 JarvisFile1.vshost.exe 信息:0:SAPI 不实现拼音字母选择。 线程 0x2270 已退出,代码为 259 (0x103)。 线程 0x1b8 已退出,代码为 259 (0x103)。 线程 0x1c2c 已退出,代码为 259 (0x103)。 线程 0x1650 已退出,代码为 259 (0x103)。 程序“[9444] JarvisFile1.vshost.exe:程序跟踪”已退出,代码为 0 (0x0)。 程序“[9444] JarvisFile1.vshost.exe”已退出,代码为 0 (0x0)。

【问题讨论】:

  • 这种情况什么时候发生?当您尝试关闭程序或首次运行程序时?
  • 程序没有按预期响应。然后当我关闭程序时,它给了我这个错误。如果您需要,我也可以为您提供日志..
  • 我在我的机器上运行你的相同代码,它似乎工作正常。日志可能会有所帮助。
  • 这是你的整个程序吗?
  • 是的。除此之外,我还在这里声明了另一个文本文件:

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


【解决方案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;

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

【讨论】:

  • 从他的错误信息来看,实际上听起来正好相反。听起来他在尝试使用语音引擎资源时正在释放它们
  • 有解决办法吗??
  • 上述方法你试过了吗?这应该可以解决关机问题。此外,您似乎需要为语法设置文化信息。您可以创建 Grammar 对象,然后使用 'grammerObj.Culture = New System.Globalization.CultureInfo("...")' 并且您需要在那里查找您的特定文化信息字符串。 ex 将是 en-US。
  • 它现在工作得很好。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 2021-03-19
相关资源
最近更新 更多