在我的class Clicker.cs中,我正在嘗試使用MediaPlayer. 但是,每當我呼叫該方法來關閉MediaPlayer,我都會收到呼叫執行緒無法訪問此物件的錯誤,因為另一個執行緒擁有它。此代碼在 中作業正常MainWindow.xaml.cs,但在Clicker.cs. 我在網上發現了類似的問題,解決方法是使用Dispatcher.Invoke(). 然而,這并沒有奏效。該錯誤在呼叫 StopSoundClicker() 時特別發生。我的代碼如下:
private static MediaPlayer player = new MediaPlayer();
private static bool isPlaying = false;
public Clicker(KeyInfo k)
{
player.Open(new Uri(@"C:\Users\chris\Downloads\Recording2.wav"));
player.MediaEnded = Loop;
}
private void StartSoundClicker()
{
player.Play();
isPlaying = true;
}
private static void Loop(object? sender, EventArgs? e)
{
Application.Current.MainWindow.Dispatcher.Invoke(() =>
{
if (isPlaying)
player.Play();
});
}
private async void StopSoundClicker()
{
await Application.Current.MainWindow.Dispatcher.Invoke(async () =>
{
await Task.Delay(70);
player.Stop();
isPlaying = false;
});
}
uj5u.com熱心網友回復:
通常,您應該使用Dispatcher您正在訪問的元素的 。
當然,這幾乎總是Application.Current.Dispatcher.
但在某些情況下,情況可能并非如此。
而在 CodeBehind 中,您可以簡單地使用Dispatcher- 這是 Window 的一個屬性。并且它的所有元素都相同Dispatcher。
但是在您的任務中,我認為根本不需要使用它 - 總是在 UI 執行緒上呼叫 Clicker。
在我看來,這段代碼應該可以作業:
private async void StopSoundClickerAsync(object sender, RoutedEventArgs e)
{
await Task.Delay(70);
player.Stop();
isPlaying = false;
}
uj5u.com熱心網友回復:
當您.Dispatcher從后臺執行緒呼叫 MainWindow 實體時會發生錯誤。
代替
Application.Current.MainWindow.Dispatcher
和
Application.Current.Dispatcher
我認為這個變種StopSoundClicker應該是!
private async Task StopSoundClicker()
{
await Task.Delay(70);
Application.Current.Dispatcher.Invoke(() =>
{
player.Stop();
isPlaying = false;
});
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/513338.html
標籤:C#wpf调度员
上一篇:隱藏一個帶有觸發器的控制元件
