2010-12-11 10 views
2

Ich versuche SMO in einer Windows Forms-Anwendung zu verwenden, um eine SQL Server-Datenbank wiederherzustellen. Mein Formular hat eine Schaltfläche (button1) und eine TextBox (textBox1). Wenn auf die Schaltfläche geklickt wird, wird eine Funktion aufgerufen, die überprüft, ob die SQL Server-Instanz gestartet wurde. Wenn es nicht gestartet wird, starte ich die Instanz und führe eine Wiederherstellung durch. Dies funktioniert, aber das Formular reagiert nicht, während die Funktion ausgeführt wird. Hier ist mein Code:Formular reagiert nicht beim Wiederherstellen der Datenbank

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);*/ 
     } 
    } 
} 

Gibt es eine Möglichkeit, die Form, die auf zu halten, während wiederherstellen (und SQL Server-Instanz Start) ist im Gang? Was mache ich falsch?

Antwort

2

Die Benutzeroberfläche kann keine Windows-Nachrichten pumpen (wird also nicht reagieren), wenn der UI-Thread blockiert ist. Sehen Sie sich stattdessen BackgroundWorker an, mit dem Sie länger laufende Aufgaben problemlos auf einen Worker-Thread übertragen können (aber weiterhin Aktualisierungen auf die Benutzeroberfläche übertragen).

+0

Ich glaube, er so getan, indem Sie SqlRestoreAsync –

+0

SqlRestoreAsync eine Operation Führt wiederherstellen asynchron http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.restore.sqlrestoreasync.aspx –

+0

@Jani Es ist nicht sehr asynchron, ist es blockiert ;-) Aber im Ernst, es kann einen anderen Teil der Funktion (Dienst starten, zum Beispiel), die blockiert, auch wenn SqlRestoreAsync nicht. –

1

Werfen Sie einen Blick auf die BackgroundWorker Klasse. Es ermöglicht Ihnen, einen langen laufenden Vorgang für einen anderen Thread auszuführen, ohne den UI-Thread zu blockieren.

1

AFAIR gibt es ein Verfahren wie Process in Anwendung Klasse, die Sie verwenden können, um die Nachrichten zu Ihrem Fenster zu verarbeiten, wenn der Besitzer Prozess Ihrer App reagiert nicht gut, auch wenn Sie auf einem anderen Thread etw tun und nichts mit Main Thread zu tun haben.

Warten mehr

Ja, es ist Application.DoEvents();

Steigerung Ihren Prozesses oder Hauptthread (UI Inhaber) hilfreich sein kann.