public MainWindow()
 {
     InitializeComponent();
     firstLetter = (char)0;
     random = new Random();
     points = 0;
     LocalDbQuery.DisableAll(); // Пометить все города неиспользованными
 }
 private async void finishButton_Click(object sender, RoutedEventArgs e)
 {
     if(isFinished)
     {
         postButton.IsEnabled = false;
         progressBar.IsIndeterminate = true;
         try
         {
             await Task.Run(() => { LocalDbQuery.DisableAll(); }); // Пометка всех городов неиспользованными
         }
         catch
         {
             postButton.IsEnabled = true;
             progressBar.IsIndeterminate = false;
             MessageBox.Show("Ошибка чтения базы данных!");
             this.Close();
             return;
         }
         isFinished = false;
         postButton.Visibility = Visibility.Hidden;
         stepButton.Visibility = Visibility.Visible;
         finishButton.Content = "Закончить игру";
         resultLabel.Content = String.Empty;
         historyListBox.Items.Clear();
         label.Content = "Введите город:";
         points = 0;
         firstLetter = (char)0;
         humanTextBlock.Text = String.Empty;
         skynetTextBlock.Text = String.Empty;
         isWin = false;
         postButton.IsEnabled = true;
         progressBar.IsIndeterminate = false;
     }
     else
     {
         isFinished = true;
         postButton.Visibility = Visibility.Visible;
         stepButton.Visibility = Visibility.Hidden;
         finishButton.Content = "Начать заново";
         resultLabel.Content = String.Format("Вы набрали {0} баллов в игре!", points);
     }
 }
 private async void stepButton_Click(object sender, RoutedEventArgs e)
 {
     progressBar.IsIndeterminate = true;
     stepButton.IsEnabled = false;
     if(humanResponse != null)
     {
         humanResponse.Dispose();
     }
     if(skynetResponse!= null)
     {
         skynetResponse.Dispose();
     }
     string cityName = cityTextBox.Text.Trim();
     if (cityName == String.Empty || firstLetter.ToString() != cityName[0].ToString().ToUpper() && firstLetter != 0)
     { // Если город не на ту букву или отсутствует
         progressBar.IsIndeterminate = false;
         stepButton.IsEnabled = true;
         if(firstLetter == (char)0)
         {
             MessageBox.Show("Напишите город на любую букву");
             return;
         }
         else
         {
             MessageBox.Show(String.Format("Напишите город на букву '{0}'", firstLetter));
             return;
         }
     }
     Dictionary<string, string> dict = new Dictionary<string, string>(); // Параметры для запроса к БД
     dict.Add("name", String.Format("N'{0}'", cityName));
     dict.Add("disable", "'0'");
     List<City> results;
     try
     {
         results = await Task.Run(() => { return LocalDbQuery.Select(dict);  }); // Проверка существования города в БД
     }
     catch
     {
         progressBar.IsIndeterminate = false;
         stepButton.IsEnabled = true;
         MessageBox.Show("Ошибка чтения базы данных!");
         this.Close();
         return;
     }
     if (results.Count == 0)
     {
         progressBar.IsIndeterminate = false;
         stepButton.IsEnabled = true;
         MessageBox.Show("Города нет в базе или он уже использован!");
         return;
     }
     foreach (City item in results)
     {
         historyListBox.Items.Insert(0, item); // Вывод города в историю игры
         LocalDbQuery.DisableCity(item.Id); // Пометка города как использованного
     }
     string humanCity = (historyListBox.Items[0] as City).Name;
     points++;
     humanResponse = Task.Run(() => // Запрос информации о городе с википедии
     {
         Action act = () =>
         {
             humanTextBlock.Text = humanCity + "\n";
             try
             {
                 humanTextBlock.Text += JArray.Parse(new StreamReader(WebRequests.WikiRequest(humanCity).GetResponseStream()).ReadToEnd())[2][0].ToString();
             }
             catch { }
         };
         humanTextBlock.Dispatcher.Invoke(act);
     });
     firstLetter = (historyListBox.Items[0] as City).Name.ToUpper().Last();
     if (firstLetter == 'Ь' || firstLetter == 'Ы')
     {
         firstLetter = (historyListBox.Items[0] as City).Name.ToUpper()[(historyListBox.Items[0] as City).Name.Length - 2];
     }
     dict = new Dictionary<string, string>(); // Параметры для запроса к БД
     dict.Add("first", String.Format("N'{0}'", firstLetter));
     dict.Add("disable", "'0'");
     try
     {
         results = await Task.Run(() => { return LocalDbQuery.Select(dict); }); // Проверка существования города в БД
     }
     catch
     {
         progressBar.IsIndeterminate = false;
         stepButton.IsEnabled = true;
         MessageBox.Show("Ошибка чтения базы данных!");
         this.Close();
         return;
     }
     if (results.Count == 0)
     {
         isFinished = true;
         postButton.Visibility = Visibility.Visible;
         stepButton.Visibility = Visibility.Hidden;
         finishButton.Content = "Начать заново";
         resultLabel.Content = String.Format("Вы набрали {0} баллов в игре!", points);
         progressBar.IsIndeterminate = false;
         stepButton.IsEnabled = true;
         isWin = true;
         MessageBox.Show("Поздравляю! Вы выиграли компьютер!");
         return;
     }
     string name = results[random.Next(results.Count)].Name;
     foreach (City item in results)
     {
         if (item.Name == name)
         {
             historyListBox.Items.Insert(0, item); // Вывод города в историю игры
             LocalDbQuery.DisableCity(item.Id); // Пометка города как использованного
         }
     }
     string skynetCity = (historyListBox.Items[0] as City).Name;
     skynetResponse = Task.Run(() => // Запрос информации о городе с википедии
     {
         Action act = () => {
             skynetTextBlock.Text = skynetCity + "\n";
             try
             {
                 skynetTextBlock.Text += JArray.Parse(new StreamReader(WebRequests.WikiRequest(skynetCity).GetResponseStream()).ReadToEnd())[2][0].ToString();
             }
             catch { }
         };
         humanTextBlock.Dispatcher.Invoke(act);
     });
     firstLetter = (historyListBox.Items[0] as City).Name.ToUpper().Last();
     if (firstLetter == 'Ь' || firstLetter == 'Ы')
     {
         firstLetter = (historyListBox.Items[0] as City).Name.ToUpper()[(historyListBox.Items[0] as City).Name.Length - 2];
     }
     label.Content = String.Format("Введите город на букву '{0}':", firstLetter);
     cityTextBox.Text = String.Empty;
     progressBar.IsIndeterminate = false;
     stepButton.IsEnabled = true;
 }