UWP - Dispatcher Timer未在所需的TimeSpan上有效运行

时间:2015-11-20 15:13:37

标签: c# timer windows-10 uwp

我正在尝试构建自己的节拍器UWP应用程序,这是我迄今为止所做的:

  1. 我设计了一个Class,它将使用DispatcherTimer处理我的应用程序的所有所需操作

    ...
    public MetronomeContructor(int upperNum, int lowerNum, int bpm, System.Uri baseURI, MainPage page, MediaElement mediaTick, MediaElement mediaTock)
    {
        UpperNum = upperNum;
        LowerNum = lowerNum;
        Bpm = bpm;
        BaseURI = baseURI;
        CalculateBpm(Bpm);
        Page = page;
        Tick = mediaTick;
        Tock = mediaTock;
        DispTimer = new DispatcherTimer();
        DispTimer.Tick += new EventHandler<object>(timer_Tick);
        Tick.AutoPlay = false;
        Tock.AutoPlay = false;
        Tick.Source = new Uri(Page.BaseUri, Page.Sounds.Where(X => X.Name == "Tick").FirstOrDefault().AudioFile.ToString());
        Tock.Source = new Uri(Page.BaseUri, Page.Sounds.Where(X => X.Name == "Click").FirstOrDefault().AudioFile.ToString());
        StartInterval();
    }
    
    //*************************************************************
    //Methods 
    public void CalculateBpm(int bpms)
    {            
        this.TimerMSecs = (1000 * 60) / bpms;            
    }
    
    //*********************************
    //Dispatcher Methods and Events
    public void StartInterval()
    {            
        DispTimer.Interval = TimeSpan.FromMilliseconds(TimerMSecs);         
    }
    
    async void timer_Tick(object sender, object e)
    {
        await Page.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>
        {
            Tick.Play();                
        });
    }
    
  2. 我的主页看起来像这样:

    public sealed partial class MainPage : Page
    {        
    public ObservableCollection<Sound> Sounds;
    private MetronomeContructor novo;
    
    public MainPage()
    {
        this.InitializeComponent();                    
    
        Sounds = new ObservableCollection<Sound>();
        SoundManager.GetAllSounds(Sounds);
    
        novo = new MetronomeContructor(4, 4, 120, this.BaseUri, this, MediaElemTick, MediaElemTock);
    }
    private void sliderBpm_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
    {           
            if (novo != null)
            {
                novo.Bpm = (int)sliderBpm.Value;
                novo.CalculateBpm(novo.Bpm);
                DisplayTxtBlock.Text = novo.Bpm.ToString();
                novo.StartInterval();
            }                     
    }
    
    private void StartButton_Click(object sender, RoutedEventArgs e)
    {
        if (novo!=null)
        {
            novo.DispTimer.Start();
        }
    }
    
    private void StopButton_Click(object sender, RoutedEventArgs e)
    {
        if (novo != null)
        {
            novo.DispTimer.Stop();
        }
    }
    
  3. 我还在开始实现这项功能,但作为一名音乐家,我意识到调度程序在给定的TimeSpan上没有有效运行,所以我试图让它成为异步操作。虽然不准确。

    我用Dispatcher读到这一点,我们肯定不会在TimeSpan之前运行,但是有可能它可以在没有控制权的TimeSpan之后运行。 我的问题是这个设计问题?有没有人知道UWP中有效的定时器? 如何实施一个有效的简单节拍器呢?

    注意事项:我正在使用VisualStudio 2015构建UWP Windows 10应用程序我是一个喜欢在我的空闲时间编写代码的音乐家,任何设计或代码改进的理念都很好。英语也不是我的母语。 TY

0 个答案:

没有答案