0
我只是想通過按鈕單擊播放.wav聲音,通過使用.Net 4.0 - Task.Factory進行選擇它播放的很好,但是一會兒我想通過其他按鈕快速停止這個聲音,我可以說停止按鈕,但它不會很快停止聲音,它只在完成播放後纔會停止...下面是我的代碼...通過按鈕單擊播放聲音,但無法通過另一個按鈕阻止它從主線程
CancellationTokenSource tokenSource = new CancellationTokenSource();
private void btnStartPlaying_Click(object sender, EventArgs e)
{
tokenSource = new CancellationTokenSource();
List<Task> tasks = new List<Task>();
var ui = TaskScheduler.FromCurrentSynchronizationContext();
int playTimes = 3;
var compute = Task.Factory.StartNew(() =>
{
Playing(playTimes);
}, tokenSource.Token);
tasks.Add(compute);
var displayResults = compute.ContinueWith(resultTask =>
Environment.NewLine,
CancellationToken.None,
TaskContinuationOptions.OnlyOnRanToCompletion,
ui);
var displayCancelledTasks = compute.ContinueWith(resultTask =>
Environment.NewLine,
CancellationToken.None,
TaskContinuationOptions.OnlyOnCanceled, ui);
Task.Factory.ContinueWhenAll(tasks.ToArray(),
result =>
{
}, CancellationToken.None, TaskContinuationOptions.None, ui);
}
private void btnStopPlaying_Click(object sender, EventArgs e)
{
tokenSource.Cancel();
}
public void Playing(int times)
{
try
{
using (SoundPlayer player = new SoundPlayer("mySoundFile.wav"))
{
for (int i = 0; i < times; i++)
{
tokenSource.Token.ThrowIfCancellationRequested();
player.PlaySync();
}
}
}
catch (Exception ex)
{
MessageBox.Show("Stopped!!!!!");
}
}
如果你從同一個線程調用它,你能夠阻止它嗎?我的第一個猜測是SoundPlayer會在引擎蓋下啓動它自己的線程,並停止啓動它的線程不會執行任何操作。你能告訴玩家停止而不是試圖阻止線程嗎? – LightStriker
您需要在另一個線程上調用Stop()方法。同時設置一個標誌,以便您知道PlaySync()已完成,因爲您停止了它。 –