2017-07-25 44 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

謝謝你的幫助! –