2010-12-11 8 views
2

Windows Forms 응용 프로그램에서 SMO를 사용하여 SQL Server 데이터베이스를 복원하려고합니다. 내 양식에는 Button (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 인스턴스 시작) 진행을 복원하면서 반응 형태를 유지하는 방법이 : 여기 내 코드는? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

2

UI 스레드가 차단 된 경우 UI가 Windows 메시지를 펌프 할 수 없으므로 (응답하지 않는 것처럼 보임) 대신 BackgroundWorker을 보면 더 오래 실행되는 작업을 작업자 스레드로 쉽게 푸시 할 수 있습니다 (그러나 여전히 UI로 업데이트를 푸시).

+0

나는 복원 작업 비동기 http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.restore.sqlrestoreasync.aspx –

+0

SqlRestoreAsync를 사용하여 그렇게 생각 하지만 블록이 너무 비동기 적이지는 않습니다 .-)하지만 더 심각하게 보면 SqlRestoreAsync가 차단하지 않아도 블록 (예 : 서비스 시작)의 다른 부분이있을 수 있습니다. –

+0

@Jani 수행 그가 SqlRestoreAsync –

1

BackgroundWorker 클래스를 살펴보십시오. UI 스레드를 차단하지 않고 다른 스레드에서 장기 실행 작업을 수행 할 수 있습니다. ProcessMessages 앱의 소유자 프로세스가 다른 스레드에서 STH을하더라도 잘 반응하지 않는 경우에 당신의 창에 메시지를 처리하는 데 사용할 수있는에서 응용 프로그램 클래스와 같은 방법이

1

AFAIR 메인 스레드와 아무 관련이 없습니다. 더

에 대한

기다리 네, 그것은 Application.DoEvents();

도움이 될 수 있습니다 프로세스 또는 홈페이지 스레드 (UI 소유자)를 밀어입니다.

관련 문제