C# 螺纹不';我不能正常工作

C# 螺纹不';我不能正常工作,c#,multithreading,C#,Multithreading,我有一个应用程序,就是重复我听到的数字,然后记录我读到的数字。数字是0,1,2,3,4,5,6,7,8,9。我使用for循环来播放这些数字,并使用文本到语音的技巧,这是来自第三方的 对于录制部分,我必须根据第三方的要求将其放在单独的线程中。要录制语音,方法可能是: recordVoiceResource.Record(fileName); 要停止此操作,请使用: recordVoiceResource.Stop(); 现在我发现有时候我的录音是0秒,这意味着代码可能没有到达Record行

我有一个应用程序,就是重复我听到的数字,然后记录我读到的数字。数字是
0,1,2,3,4,5,6,7,8,9
。我使用for循环来播放这些数字,并使用文本到语音的技巧,这是来自第三方的

对于录制部分,我必须根据第三方的要求将其放在单独的线程中。要录制语音,方法可能是:

 recordVoiceResource.Record(fileName);
要停止此操作,请使用:

 recordVoiceResource.Stop();
现在我发现有时候我的录音是0秒,这意味着代码可能没有到达
Record
行。有时只有2秒钟。我认为线程调度是错误的

 private ManualResetEvent terminate = new ManualResetEvent(false);

 PlayTTS("Please repeat the following numbers as you hear them.");

                Thread t = new Thread(() => RecordNumbers());
                t.Start();
                Thread.Sleep(2000);
                terminate.Set();
                terminate.WaitOne();
                PlayNumbers();
                recordVoiceResource.Stop();
线程方法是:

    private void RecordNumbers()
    {
        recordVoiceResource = TelephonyServer.GetVoiceResource();
        recordVoiceResource.MaximumSilence = 1;
        recordVoiceResource.MaximumTime = 30;
        // Start recording what I read from I heard
        recordVoiceResource.Record(fileName);
    }
对于播放号码

    private void PlayNumbers()
    {
        foreach (var item in numbers)
        {
            try
            {
                vr.PlayTTS(item.ToString()); // will be 0,1,2,...9
                Thread.Sleep(2000);
            }

您的问题很可能是由于
Thread.Sleep()
引起的。改用计时器:

System.Timers.Timer Record = new System.Timers.Timer();
Record.Interval = 2000;
Record.Elapsed += new System.Timers.ElapsedEventHandler(Record_Elapsed);

            void Record_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {                   
                 Record.Enabled=false;                  
                 PlayNumbers();
                 recordVoiceResource.Stop();
            }
并设置:

Thread t = new Thread(() => RecordNumbers());
              t.Start();
              Record.Enabled=true;

根据您的评论,属性
MaximumSilence
获取或设置在下一个语音功能终止前允许的最大静音(以秒为单位)。您将其设置为1秒,开始录制,然后在开始播放提示用户说些什么之前睡眠两秒。你看到这里的问题了吗?假设麦克风在这段时间内没有拾取一些无关的语音,录音将在播放开始之前停止

由于数字播放之间有2秒的间隔,您可能需要将
最大静音设置为几秒


当然,也就是说,假设您的意图是捕获说所有数字的用户的单个记录(这就是您的代码编写方式)。如果要单独捕获语音数字,则可能需要在播放每个数字时安排并同步单独的录音。您可能需要仔细检查API,以确保您的解决方案符合预期。

为什么要线程。睡眠???…像魔鬼一样避免它我必须在每个数字之间等待2秒,这样我才能清楚地听到。播放“0 1 2 3 4 5 6 7 8 9”在每个号码之间留出2秒钟让来电者重复。你的ManualResetEvent在等待什么?那么问题是什么?我的问题是它没有像我说的那样录制声音。-@apomene,你的代码不起作用。请仔细检查terminate的用法,我对此表示怀疑。-@apomene,我感谢您的回答,但您的代码仍然不起作用。运行代码后,它转到最后一个块,然后跳转到线程。我刚刚找到了问题的解决方案,根据我的原始代码设置MaximumSilence=0,然后就可以了。但不知道为什么?需要更多的研究。-@Mike,我删除了第一个线程。Sleep(2000),这是在开始播放之前。我还设置了MaximumSilence=0,这样就行了。根据你的回答,是的。如果MaximumSilence=4,这比2大,那么它可以工作。谢谢我还需要使用ManualResetEvent吗?@Love您可能需要使用
ManualResetEvent
等待录制线程完成(在这种情况下,您需要将其设置在
RecordNumber
的末尾)。但是
t.Join()
也应该工作(等待线程完成)。