2016-04-08 5 views
1

Это мой первый вопрос на этом форуме. Я французский студент, извините за мой английский. В моем коде я хочу извлечь значение из Dispatcher.BeginInvoke.. Вот часть моего кода, которая является проблематичной.Как получить значение Dispatcher.BeginInvoke в WPF/C#

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; 
    } 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^