2017-07-25 46 views
0

编辑:我想将文本块的值更新为在另一个类上定期生成的随机变量的值。将文本块更新为WPF中变量的值

我的实现阻止了应用程序中的其他功能(按钮)。任何建议?

public partial class MainWindow : Window 
{ 
    TaskViewModel viewModel = new TaskViewModel(); 

    public MainWindow() 
    { 
     this.DataContext = viewModel; 
     InitializeComponent(); 
     Server_V2.AsyncService.runMain(); 
     DisplayAV(); 
    } 

    //Display Availability 
    private async void DisplayAV() { 
     while (true) { 
      //availabilityField.Text = Server_V2.AV.ToString(); 
      viewModel.Availability = Server_V2.AV.ToString(); 
      await Task.Delay(500); 
     } 
    } 

    public class TaskViewModel : INotifyPropertyChanged 
    { 
     private string availabilty = "0"; 
     public string Availability 
     { 
      get { return availabilty; } 
      set { availabilty = value; OnStaticPropertyChanged();} 
     } 
     public event PropertyChangedEventHandler PropertyChanged; 
     public void OnStaticPropertyChanged([CallerMemberName] string PropertyName = null) 
     { 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName)); 
     } 
    } 
+2

您应该添加什么你都试过(代码)的答案。即使它没有运行。如果不付出努力,你将不会得到社区的帮助。 – Ben

+0

我可以看看你试过了吗?你还指什么其他实现?你能告诉我这个班级以及你如何访问这些变量吗?你是否在使用事件,因为它会定期更新?一个计时器可能? –

+0

如果'AV'的意思是类Server_V2中的静态属性,请按照此答案中给出的说明进行操作:https://stackoverflow.com/a/34763286/1136211 – Clemens

回答

0

您应该使用后台工作。异步代码仍然在主线程上运行。

就像这个...

BackgroundWorker worker = new BackgroundWorker(); 
    public MainWindow() 
    { 
     this.DataContext = viewModel; 
     InitializeComponent(); 
     Server_V2.AsyncService.runMain(); 
     worker.DoWork += Worker_DoWork; 
     worker.RunWorkerAsync(); 
    } 

    private void Worker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     while (true) 
     { 
      //availabilityField.Text = Server_V2.AV.ToString(); 
      viewModel.Availability = Server_V2.AV.ToString(); 
      Thread.Sleep(500); 
     } 
    } 
+0

谢谢!这工作。我知道我应该使用后台工作人员来处理与UI元素的所有交互,但是后台工作人员和任务之间处理方式的主要区别是什么? –

+0

从这篇文章https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/index:“async和await关键字不会导致创建额外的线程。异步方法不需要多线程,因为异步方法不会在其自己的线程上运行。“异步/等待是编写代码的一种方式。你的问题需要另一个线程,这是后台工作者所做的。 – AQuirky

+0

谢谢你的帮助! –