簡體   English   中英

如何在WPF / C#中檢索Dispatcher.BeginInvoke的值

[英]How retrieve value of a Dispatcher.BeginInvoke in WPF/C#

這是我在這個論壇上的第一個問題。 我是法國學生,對不起我的英語。 在我的代碼中,我想從Dispatcher.BeginInvoke.提取一個值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的代碼,該代碼使我感到WorldFarmeCollision

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

我想要perso.WordFarmeCollision返回在Jouer類中可用的值。

感謝您的回答。

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/zh-cn/library/hh199426(v=vs.110).aspx

由於我目前尚未設置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;
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM