Изучаю BackgroundWorker, решил попробовать на своей программе (при проверке обновлений), добавив BackgroundWorker. Вроде сделал всё примерно как на msdn, но программа сразу же вылетает. В отладке написано:
Что я сделал не так, я не понимаю.
Проверка обновлений идёт через MySQL, некоторые личные части кода стёр.
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace mpapp
{
/// <summary>
/// Логика взаимодействия для Updater.xaml
/// </summary>
public partial class Updater : Window
{
string sqlconn = "---";
const string this_version = "3900";
string act_version;
private BackgroundWorker bw;
public Updater()
{
InitializeComponent();
InitializeBackgroundWorker();
}
private void InitializeBackgroundWorker()
{
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
}
private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pb.Value = e.ProgressPercentage;
}
async private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (act_version == this_version)
{
upd_info.Text = "Обновлений нет.";
await Task.Delay(3000);
Window login = new Login();
Close();
login.Show();
}
else
{
upd_info.Text = "Есть обновление.";
}
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
if (!File.Exists("---") | !File.Exists("Mysql.Data.dll"))
{
MessageBox.Show("Error", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
error_exit();
}
try
{
MySqlConnection conn = new MySqlConnection(sqlconn);
string sql = "SELECT ver FROM versions WHERE id = 3";
conn.Open();
MySqlCommand com = new MySqlCommand(sql, conn);
act_version = com.ExecuteScalar().ToString();
conn.Close();
}
catch (Exception exept)
{
MessageBox.Show(exept.ToString());
error_exit();
}
if (bw.CancellationPending)
{
e.Cancel = true;
return;
}
e.Result = act_version;
}
private void minimize_Click(object sender, RoutedEventArgs e) => WindowState = WindowState.Minimized;
private void exit_Click(object sender, RoutedEventArgs e) => Environment.Exit(0);
private void MoveForm_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) => DragMove();
async private void Window_Loaded(object sender, RoutedEventArgs e)
{
await Task.Delay(3000);
bw.RunWorkerAsync();
}
async static public void error_exit()
{
await Task.Delay(3000);
Environment.Exit(0);
}
}
}
Task.wait()останавливает текущий поток для того, чтобы дождаться следующего? – Arasfon Jan 07 '18 at 18:48finally, а не как у вас в блокеtry. – Bulson Jan 07 '18 at 19:16awaitиTaskвместе сBackgroundWorker- это подобно использованию в современном авто движка на пару или колес от автомобиля 30-х годов прошлого века. Изучите лучше этот пример. – Bulson Jan 07 '18 at 19:20