2016-04-08 17 views
1

這是我在這個論壇上的第一個問題。我是法國學生,對我的英語很抱歉。在我的代碼中,我想從Dispatcher.BeginInvoke.中提取一個值。這是我的代碼中有問題的部分。如何檢索WPF/C中的Dispatcher.BeginInvoke的值#

public partial class Jouer : Window 
{ 
    // private Timer timer_creer_obstacle; 
    private Timer timer_personnage_chute; 
    private Timer timer_obstacles_avance; 
    private Personnage perso; 
    private Decor decor; 
    public Jouer() 
    { 
     InitializeComponent(); 
     perso = new Personnage("canard-de-bain.png", World); 
     decor = new Decor(World); 
     // Timer qui gère l'avancé des obstacles 
     timer_obstacles_avance = new Timer(); 
     timer_obstacles_avance.Enabled = true; 
     timer_obstacles_avance.Interval = 60; 
     timer_obstacles_avance.Elapsed += timer_obstacles_avance_event; 
     timer_obstacles_avance.AutoReset = true; 
     // Timer qui gère la chute du personnage 
     timer_personnage_chute = new Timer(); 
     timer_personnage_chute.Enabled = true; 
     timer_personnage_chute.Interval = 60; 
     timer_personnage_chute.Elapsed += timer_personnage_chute_event; 
     timer_personnage_chute.AutoReset = true; 
    } 
    public void timer_personnage_chute_event(object sender, ElapsedEventArgs e) 
    { 
     perso.Dispatcher.BeginInvoke(// Dispatcher pour utiliser le multithearding 
      DispatcherPriority.Normal, 
      new Action(() => 
      { 
       perso.Chuter(); 
       perso.WorlFarmeCollision(); 
      })); 

這裏是代碼WorldFarmeCollision,返回我一個布爾。

public bool WorlFarmeCollision() 
{ 
    if (this.Y >= 350 || this.Y <= 0) 
    { 
     App.Current.Shutdown(); 
     return true; 
    } 
    else 
     return false; 
} 

我想perso.WordFarmeCollision在我Jouer類可返回一個值。

感謝您的回答。

回答

2

BeginInvoke是異步執行的,因此你不能得到的返回值瞬間。

改爲將其改爲Invoke

public void timer_personnage_chute_event(object sender, ElapsedEventArgs e) 
{ 
    bool result = perso.Dispatcher.Invoke(// Dispatcher pour utiliser le multithearding 
     () => 
     { 
      perso.Chuter(); 
      return perso.WorlFarmeCollision(); 
     } 
     , DispatcherPriority.Normal); 

參考:https://msdn.microsoft.com/en-us/library/hh199426(v=vs.110).aspx

+0

謝謝您非常有用和快速的解答, 我用你slolution和它完美的作品! 再次感謝 –

0

我正在這樣做,因爲我目前沒有設置WPF環境。這應該指向你,雖然方向是正確的......

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

    } 


    private void button_Click(object sender, RoutedEventArgs e) 
    { 
     Perso perso = new Perso(); 

     Func<bool> getWorlFarmeCollisionAsyncDelegate = perso.WorlFarmeCollision; 

     getWorlFarmeCollisionAsyncDelegate.BeginInvoke(
       (resultASync) => 
       { 
        var methodDelegate = (Func<bool>)resultASync.AsyncState; 
        perso.Dispatcher.BeginInvoke(
        new Action(() => perso.BoolProperty = methodDelegate.EndInvoke(resultASync))); 

       }, 
       getWorlFarmeCollisionAsyncDelegate); 
    } 
} 

public class Perso 
{ 
    public Dispatcher Dispatcher => Application.Current.Dispatcher; 

    public bool BoolProperty { get; set; } 

    public bool WorlFarmeCollision() 
    { 
     return true; 
    } 

}