title: Pausing a program to allow user to interact in wpf
body: <p>Ok, so this is a kind of general program. I am trying to write a poker program where the user can interact against computer players. However, in order to simplify it I am testing with a much simpler program where two players are trying to guess a number from the computer. One is a human player and the other is a computer player. </p>
  
  <p>In the game, the players take turn to guess the number beeing set by the program. The computer player just randomizes numbers, where as the user should input a number and press a guess button (or have the option to quit). </p>
  
  <p>My problem is that when it is the humans players turn to act, how can I pause the excecution of the game in order for the human to respond by pressing a button or enter text? </p>
  
  <p>I have tried with using Timer and starting it and waiting for the thread to end but it seems as if that still freezes the gui. </p>
  
  <p>I have also tried to send messages from a background worker thread to update the gui but that gives me an error about not beeing able to access the gui elements from another thread. </p>
  
  <p>Does anyone have any suggestions on how to implement this? </p>
  
  <p>Note that this is not a complete program, since I just made this to understand how to interact with the gui during execution. </p>
  
  <p>The number guesser class:</p>
  
  <pre><code>public class NumberGuesser {
  
      public Player HumanPlayer { get; private set; }
  
      public Player ComputerPlayer { get; private set;}
  
      private Player[] _players = new Player[2];
  
      private int _maxNumber = 20;
  
      private bool _done = false;
  
      private Random random;
  
      public NumberGuesser() {
  
          HumanPlayer = new HumanPlayer("Me");
  
          ComputerPlayer = new ComputerPlayer("HAL9000");
  
          _players[0] = HumanPlayer;
          _players[1] = ComputerPlayer;
  
          random = new Random((int) DateTime.Now.Ticks);
  
      }
  
      public void Play() {
  
          var myNumber = random.Next(_maxNumber);
          var index = 0;
          while (!_done) {
  
              var currentPlayer = _players[index];
  
              var guess = currentPlayer.Act(_maxNumber);
              if (guess == myNumber) {
                  currentPlayer.Score++;
              }
  
              index = (1 + index)%2;
          }
  
      }
  }
  </code></pre>
  
  <p>The computer player:</p>
  
  <pre><code>public class ComputerPlayer : Player {
  
      private readonly Random _random = new Random((int)DateTime.Now.Ticks);
  
      public ComputerPlayer(string name) : base(name) {
      }
  
      public override int Act(int max) {
  
          return _random.Next(max);
  
      }
  }
  </code></pre>
  
  <p>The human player: </p>
  
  <pre><code>public class HumanPlayer : Player {
  
      public HumanPlayer(string name) : base(name) {
  
      }
  
      public override int Act(int max) {
  
          return UserGuess();
  
      }
  
      private int UserGuess() {
  
  
          return 0;
  
      }
  }
  </code></pre>
  
  <p>The player class: </p>
  
  <pre><code>public class Player {
      public string Name { get; private set; }
      public int Score { get; set; }
  
      public Player(string name) {
          Name = name;
      }
  
  
      public virtual int Act(int max) {
          // How should the human enter the guess here???
          return 0;
      }
  }
  </code></pre>
  
  <p>My main window:</p>
  
  <pre><code>&lt;Window x:Class="GuessMyNumber.MainWindow"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="MainWindow" Height="395" Width="728"&gt;
  &lt;Grid&gt;
      &lt;Label Content="Guess my number!" Height="28" HorizontalAlignment="Left" Margin="122,58,0,0" Name="label1" VerticalAlignment="Top" /&gt;
      &lt;Grid Height="174" HorizontalAlignment="Left" Margin="31,170,0,0" Name="grid1" VerticalAlignment="Top" Width="272" DataContext="{Binding Path=HumanPlayer}"&gt;
          &lt;Label Content="Human player" Height="28" HorizontalAlignment="Left" Margin="6,6,0,0" Name="label2" VerticalAlignment="Top" /&gt;
          &lt;TextBox Height="23" HorizontalAlignment="Left" Margin="55,92,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" 
                   Text="{Binding Path=HumanGuess, UpdateSourceTrigger=PropertyChanged}"/&gt;
          &lt;Button Content="Guess" Height="23" HorizontalAlignment="Left" Margin="79,130,0,0" Name="button1" VerticalAlignment="Top" Width="75"
                  Command="{Binding Path=GuessCommand}"/&gt;
          &lt;Label Content="{Binding Path=Name}" Height="28" HorizontalAlignment="Left" Margin="96,6,0,0" Name="label3" VerticalAlignment="Top" /&gt;
          &lt;Label Content="Score" Height="28" HorizontalAlignment="Left" Margin="6,40,0,0" Name="label4" VerticalAlignment="Top" /&gt;
          &lt;TextBox Height="23" HorizontalAlignment="Left" Margin="55,42,0,0" Name="textBox2" VerticalAlignment="Top" Width="75" Text="{Binding Path=Score, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" /&gt;
          &lt;Button Content="Quit" Height="23" HorizontalAlignment="Left" Margin="182,130,0,0" Name="buttonQuit" VerticalAlignment="Top" Width="75" Command="{Binding Path=QuitCommand}" /&gt;
      &lt;/Grid&gt;
      &lt;Grid Height="174" HorizontalAlignment="Left" Margin="328,170,0,0" Name="grid2" VerticalAlignment="Top" Width="270" DataContext="{Binding Path=ComputerPlayer}" &gt;
  
          &lt;Label Content="Computer player" Height="28" HorizontalAlignment="Left" Margin="6,6,0,0"  VerticalAlignment="Top" /&gt;
          &lt;TextBox Height="23" HorizontalAlignment="Left" Margin="55,92,0,0"  VerticalAlignment="Top" Width="120" Text="{Binding Path=HumanGuess, UpdateSourceTrigger=PropertyChanged}"/&gt;
  
          &lt;Label Content="{Binding Path=Name}" Height="28" HorizontalAlignment="Left" Margin="111,6,0,0" VerticalAlignment="Top" /&gt;
          &lt;Label Content="Score" Height="28" HorizontalAlignment="Left" Margin="6,40,0,0" VerticalAlignment="Top" /&gt;
          &lt;TextBox Height="23" HorizontalAlignment="Left" Margin="55,42,0,0"  VerticalAlignment="Top" Width="75" Text="{Binding Path=Score, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" /&gt;
      &lt;/Grid&gt;
      &lt;Button Content="Start Playing" Height="23" HorizontalAlignment="Left" Margin="254,59,0,0" Name="buttonStartPlay" VerticalAlignment="Top" Width="75" Click="buttonStartPlay_Click" /&gt;
  &lt;/Grid&gt;
  </code></pre>
  
  <p></p>
  
  <p>And the code behind:</p>
  
  <pre><code>/// &lt;summary&gt;
  /// Interaction logic for MainWindow.xaml
  /// &lt;/summary&gt;
  public partial class MainWindow : Window {
  
      private readonly NumberGuesser _numberGuesser;
  
      public MainWindow() {
          InitializeComponent();
          _numberGuesser = new NumberGuesser();
          DataContext = _numberGuesser;
  
      }
  
      private void buttonStartPlay_Click(object sender, RoutedEventArgs e) {
  
          _numberGuesser.Play();
  
      }
  
  }
  </code></pre>