[英]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.