2016-04-08 18 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; 
} 

私は私のJouerクラスで使用可能な値を返しperso.WordFarmeCollisionたい。

ご回答ありがとうございます。

答えて

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

} 
関連する問題