RaceOnRCWCleanup when 运行 用于语音识别的控制台应用程序
RaceOnRCWCleanup when running console app for speech recognition
我不知道我们是否可以为语音识别创建一个控制台应用程序(搜索相同但没有找到任何答案)并尝试了这个代码。
我在 winforms 应用程序中使用此代码
但是当尝试在控制台中创建此应用程序时 visual studio 给出了一个非常奇怪的错误 mscorelib.pdb 而不是 found.And 转移到页面 mscorelib.pdb
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Speech;
using System.Speech.Recognition;
using System.Speech.Synthesis;
using System.Threading;
namespace ConsoleApplication2
{
public class Program
{
public static void Main(string[] args)
{
tester tst = new tester();
tst.DoWorks();
}
}
public class tester
{
SpeechSynthesizer ss = new SpeechSynthesizer();
SpeechRecognitionEngine sre = new SpeechRecognitionEngine();
PromptBuilder pb = new PromptBuilder();
Choices clist = new Choices();
public void DoWorks()
{
clist.Add(new string[] { "how are you", "what is the current time", "open chrome", "hello" });
Grammar gr = new Grammar(new GrammarBuilder(clist));
sre.RequestRecognizerUpdate();
sre.LoadGrammar(gr);
sre.SetInputToDefaultAudioDevice();
sre.SpeechRecognized += sre_recognised;
sre.RecognizeAsync(RecognizeMode.Multiple);
}
public void sre_recognised(object sender, SpeechRecognizedEventArgs e)
{
switch (e.Result.Text.ToString())
{
case "hello":ss.SpeakAsync("Hello shekar");
break;
case "how are you": ss.SpeakAsync("I am fine and what about you");
break;
case "what is the time":ss.SpeakAsync("current time is: " + DateTime.Now.ToString());
break;
case "open chrome":System.Diagnostics.Process.Start("chrome", "wwe.google.com");
break;
default: ss.SpeakAsync("thank you");
break;
}
Console.WriteLine(e.Result.Text.ToString());
}
}
}
这里是错误页面的截图
我也加载了给定的选项“Microsoft.symbol.Server”,但它仍然给出相同的输出。
编辑
这是输出 window
输出的篇幅比较大,无法展示所有的输出,截取了一些相关的部分(遗憾)。
您看到调试器发出 RaceOnRCWCleanup。原因可能是您正在实例化但没有正确清理由 SpeechSynthesizer
and/or SpeechRecognitionEngine
.
在幕后创建的 COM 对象
同时,控制台应用程序不会自动 'kept alive'。您需要专门添加代码以防止其立即退出。
你需要做两件事:
- 确保您的应用程序保持足够长的生命周期(例如,通过在
Main
方法中添加 Console.ReadLine()
语句
- 确保正确清理资源。 SpeechRecognitionEngine 和 SpeechSynthesizer 都实现了
IDisposable
,因此在不再需要时应将其丢弃。要正确执行此操作,请在您的测试器 class: 中实施 IDisposable
示例:
public class Tester
{
SpeechSynthesizer ss = new SpeechSynthesizer();
SpeechRecognitionEngine sre = new SpeechRecognitionEngine();
public void Dispose()
{
ss.Dispose();
sre.Dispose();
}
}
我不知道我们是否可以为语音识别创建一个控制台应用程序(搜索相同但没有找到任何答案)并尝试了这个代码。
我在 winforms 应用程序中使用此代码
但是当尝试在控制台中创建此应用程序时 visual studio 给出了一个非常奇怪的错误 mscorelib.pdb 而不是 found.And 转移到页面 mscorelib.pdb
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Speech;
using System.Speech.Recognition;
using System.Speech.Synthesis;
using System.Threading;
namespace ConsoleApplication2
{
public class Program
{
public static void Main(string[] args)
{
tester tst = new tester();
tst.DoWorks();
}
}
public class tester
{
SpeechSynthesizer ss = new SpeechSynthesizer();
SpeechRecognitionEngine sre = new SpeechRecognitionEngine();
PromptBuilder pb = new PromptBuilder();
Choices clist = new Choices();
public void DoWorks()
{
clist.Add(new string[] { "how are you", "what is the current time", "open chrome", "hello" });
Grammar gr = new Grammar(new GrammarBuilder(clist));
sre.RequestRecognizerUpdate();
sre.LoadGrammar(gr);
sre.SetInputToDefaultAudioDevice();
sre.SpeechRecognized += sre_recognised;
sre.RecognizeAsync(RecognizeMode.Multiple);
}
public void sre_recognised(object sender, SpeechRecognizedEventArgs e)
{
switch (e.Result.Text.ToString())
{
case "hello":ss.SpeakAsync("Hello shekar");
break;
case "how are you": ss.SpeakAsync("I am fine and what about you");
break;
case "what is the time":ss.SpeakAsync("current time is: " + DateTime.Now.ToString());
break;
case "open chrome":System.Diagnostics.Process.Start("chrome", "wwe.google.com");
break;
default: ss.SpeakAsync("thank you");
break;
}
Console.WriteLine(e.Result.Text.ToString());
}
}
}
这里是错误页面的截图
我也加载了给定的选项“Microsoft.symbol.Server”,但它仍然给出相同的输出。
编辑
这是输出 window
输出的篇幅比较大,无法展示所有的输出,截取了一些相关的部分(遗憾)。
您看到调试器发出 RaceOnRCWCleanup。原因可能是您正在实例化但没有正确清理由 SpeechSynthesizer
and/or SpeechRecognitionEngine
.
同时,控制台应用程序不会自动 'kept alive'。您需要专门添加代码以防止其立即退出。
你需要做两件事:
- 确保您的应用程序保持足够长的生命周期(例如,通过在
Main
方法中添加Console.ReadLine()
语句 - 确保正确清理资源。 SpeechRecognitionEngine 和 SpeechSynthesizer 都实现了
IDisposable
,因此在不再需要时应将其丢弃。要正确执行此操作,请在您的测试器 class: 中实施
IDisposable
示例:
public class Tester
{
SpeechSynthesizer ss = new SpeechSynthesizer();
SpeechRecognitionEngine sre = new SpeechRecognitionEngine();
public void Dispose()
{
ss.Dispose();
sre.Dispose();
}
}