Форма не отвечает при восстановлении базы данных - PullRequest
2 голосов
/ 11 декабря 2010

Я пытаюсь использовать SMO в приложении Windows Forms для восстановления базы данных SQL Server.Моя форма имеет кнопку (button1) и TextBox (textBox1).При нажатии кнопки вызывается функция, которая проверяет, запущен ли экземпляр SQL Server.Если он не запущен, я запускаю экземпляр и выполняю восстановление.Это работает, но форма не реагирует на выполнение функции.Вот мой код:

using System;
using System.Windows.Forms;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Smo.Wmi;

namespace WindowsFormsApplication7
{    

    delegate void RestoreDatabaseDelegate();

    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            BeginInvoke(
                new RestoreDatabaseDelegate(RestoreDatabase));
        }

        private void RestoreDatabase()
        {
            //textBox1.Text = "";

            try
            {
                Restore dbRestore = new Restore();
                dbRestore.Database = "Sandbox";
                dbRestore.Devices.Add(
                    new BackupDeviceItem(
                        @"C:\scripts\sandbox.bak", DeviceType.File));

                Service service =
                    new ManagedComputer().Services["MSSQL$SQLEXPRESS2008"];

                if (service.ServiceState == ServiceState.Stopped)
                {
                    service.Start();
                }

                ServerConnection connection =
                    new ServerConnection(@"TEST\SQLEXPRESS2008");
                connection.LoginSecure = true;

                Server server = new Server(connection);
                Database db = server.Databases[dbRestore.Database];

                dbRestore.ReplaceDatabase = true;
                dbRestore.Complete +=
                    new ServerMessageEventHandler(RestoreComplete);
                dbRestore.Information +=
                    new ServerMessageEventHandler(RestoreInformation);

                dbRestore.SqlRestoreAsync(server);
            }
            catch (Exception ex)
            {
                /*textBox1.Text +=
                    (ex.Message + Environment.NewLine);*/
            }
        }

        private void RestoreComplete(
            object sender, ServerMessageEventArgs e)
        {
            /*textBox1.Text += 
                (e.Error.Message + Environment.NewLine);*/
        }

        private void RestoreInformation(
            object sender, ServerMessageEventArgs e)
        {
            /*textBox1.Text += 
                (e.Error.Message + Environment.NewLine);*/
        }
    }
}

Есть ли способ обеспечить адаптацию формы во время восстановления (и запуска экземпляра SQL Server)?Что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 11 декабря 2010

Пользовательский интерфейс не может перекачивать сообщения Windows (поэтому он не отвечает), если поток пользовательского интерфейса заблокирован.Вместо этого посмотрите на BackgroundWorker, который позволяет легко помещать более длительные задачи в рабочий поток (но все равно загружать обновления в пользовательский интерфейс).

1 голос
/ 11 декабря 2010

AFAIR, существует метод, подобный ProcessMessages в классе приложения , который можно использовать для обработки сообщений в вашем окне, когда процесс владельца вашего приложения не отвечает должным образом, даже есливы делаете что-то в другом потоке и не имеете ничего общего с основным потоком.

Подождите, пока больше

Да, это Application.DoEvents();

Может помочь ускорение вашего процесса или основного потока (владельца пользовательского интерфейса).

1 голос
/ 11 декабря 2010

Посмотрите на класс BackgroundWorker . Это позволит вам выполнить длительную операцию в другом потоке, не блокируя поток пользовательского интерфейса.

...