我正在拨打自动拨打号码的应用。我正在使用主线程来查询呼叫状态(忙,拨号,活动,呼叫,停用等)。每当选择呼叫时,将使用其他线程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);
}
线程中止后无法再次启动。我怎么能这样做或者是否有任何替代解决方案。
答案 0 :(得分:1)
线程无法重启 - 当他们完成后,他们就会完成。
通常的解决方案是简单地启动一个新线程,但是当你做得很少时,使用线程池线程可能是一个更好的主意:
Task.Run(threadAutoCalling);
或者甚至更好,如果有异步方式调用PlaySound
和Speak
,请使用它 - 通常,您不需要真实 CPU工作来处理这样的操作。
答案 1 :(得分:0)
据我所知,你想要放弃你的音乐播放。因此,它更适用于Task
类。您可以通过调用Task
类Cancel()
方法取消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);
}