2012-10-20 30 views
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!!!!!"); 
      } 
} 
+0

如果你從同一個線程調用它,你能夠阻止它嗎?我的第一個猜測是SoundPlayer會在引擎蓋下啓動它自己的線程,並停止啓動它的線程不會執行任何操作。你能告訴玩家停止而不是試圖阻止線程嗎? – LightStriker

+0

您需要在另一個線程上調用Stop()方法。同時設置一個標誌,以便您知道PlaySync()已完成,因爲您停止了它。 –

回答

0

您並不是想立即停止播放,而是停止重複播放該文件。

想象一下,當代碼已經開始執行player.PlaySync();時,你已經取消了任務。應用程序無法知道已經請求取消。 它僅在下一次迭代期間拋出任務取消異常。

此外,任務班強調合作取消,這意味着你不希望聲音突然停止播放。

相關問題