如何重新启动线程或任何其他备用解决方案

时间:2015-12-07 12:43:43

标签: c# .net multithreading audio

我正在拨打自动拨打号码的应用。我正在使用主线程来查询呼叫状态(忙,拨号,活动,呼叫,停用等)。每当选择呼叫时,将使用其他线程2播放音频。当呼叫状态被取消时,主线程将通过停止线程2来停止音频。当选择呼叫时再次呼叫时,将使用线程2播放音频。

     Thread autoReminder = new Thread(new ThreadStart(threadAutoCalling));


////   Main thread on call attend calls
 autoReminder.Start();
// On call end, i tried
 autoReminder.Abort();

  private void threadAutoCalling()
        {
            try
            {
               // PlayAudio(@"C:\Users\CheatnPc\Desktop\TextToSpeechAudio\psf1.wav");

                PlayAudio(@"C:\Users\CheatnPc\Desktop\TextToSpeechAudio\psf3.wav");
                PlayAudio(@"C:\Users\CheatnPc\Desktop\TextToSpeechAudio\sales.wav");
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
 public void PlayAudio(string path)
    {

        (new Microsoft.VisualBasic.Devices.Audio()).Play(path, Microsoft.VisualBasic.AudioPlayMode.WaitToComplete);

    }
线程中止后

无法再次启动。我怎么能这样做或者是否有任何替代解决方案。

2 个答案:

答案 0 :(得分:1)

线程无法重启 - 当他们完成后,他们就会完成。

通常的解决方案是简单地启动一个新线程,但是当你做得很少时,使用线程池线程可能是一个更好的主意:

Task.Run(threadAutoCalling);

或者甚至更好,如果有异步方式调用PlaySoundSpeak,请使用它 - 通常,您不需要真实 CPU工作来处理这样的操作。

答案 1 :(得分:0)

据我所知,你想要放弃你的音乐播放。因此,它更适用于Task类。您可以通过调用TaskCancel()方法取消CancellationTokenSource

控制台应用程序示例:

CancellationTokenSource cancellationTokenSource =
        new CancellationTokenSource();
CancellationToken token = cancellationTokenSource.Token;
Task task = Task.Run(() =>
{
   while (!token.IsCancellationRequested)
   {
      ThreadAutoCalling();
   }
   token.ThrowIfCancellationRequested();
}, token);
try
   {
      Console.WriteLine("Press any key to abort the task");
      Console.ReadLine();
      cancellationTokenSource.Cancel();
      task.Wait();
   }
catch (AggregateException e)
{
     Console.WriteLine(e.InnerExceptions[0].Message);
}