【问题标题】:Threading issue when playing music file播放音乐文件时的线程问题
【发布时间】:2011-12-16 09:31:30
【问题描述】:

我想要做的是播放一段指定时间的音乐文件,然后停止播放。但是,正在播放整个音乐文件。我不能使用“PlaySync()”方法,因为我不能阻止线程。

【问题讨论】:

  • player 有自己的Stop 方法吗?
  • 也许您的停止呼叫声音甚至开始之前出现。解决方法是在播放开始时启动计时器,而不是在“播放”请求时启动。
  • 什么是PlaySync() 方法以及为什么需要这个方法?
  • 我找不到关于这个的任何细节,我错过了什么吗?
  • 我说“我不能使用 'PlaySync()' 方法,因为我不能阻止线程”......你为什么认为我'需要'它。

标签: c# .net multithreading soundplayer


【解决方案1】:

可能是这样的

 Task.Factory.StartNew(() =>
   {
    var player = new SoundPlayer();
    player.SoundLocation = "myfile";
    player.Play();
    Thread.Sleep(duration)
    player.Stop();
   });

【讨论】:

  • +1 这看起来很有趣,为什么要投反对票? (我也投了赞成票)。
  • 代码在第一个版本中没有编译;)也许这就是原因
  • 投了反对票,因为 Thread.Sleep 从来都不是一个好的解决方案(除了我从未听说过的非常特殊的极端情况)。此外,这个版本使用了 2 个线程(1 个用于 player.Play() 方法,一个由 StartNew 产生),并无用地阻塞其中一个
  • 无论如何我建议使用thread.Jojn() 等待“播放”线程完成其工作,基本上在thread.Start() 之后添加thread.Join()
  • @Falanwethanx 为您提供建议,我发现它们很有用,可能永远不会再使用 Thread.Sleep 了;)
【解决方案2】:

您不必自己生成新线程,SoundPlayer.Play 方法会自行生成。

试试这个版本:

public void Play() 
    { 
        player = new SoundPlayer(); 
        player.SoundLocation = "myfile"; 
        Timer timer = new Timer(); 
        timer.Tick += (s,e) => 
            {
                player.Stop();
                timer.Stop();
            };
        timer.Interval = duration; 
        player.Play();
        timer.Start(); 
    } 

【讨论】:

    猜你喜欢
    • 2021-04-09
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多