2016-06-27 4 views
0

DataGridの内容をCSVファイルにエクスポートする方法があります。私はWindowを表示しようとしていますが、そのアニメーションにはユーザーに待つように要求されます。SeperateThreadのウィンドウを表示してください

しかし、Windowを見ると、アニメーションがフリーズするので、これは、Excelのメソッドが同じスレッドで実行されているためにフリーズしているためです。

これまで私が試したことはこれです。

var waitWindow = new PleaseWaitWindow(); 

var newWindowThread = new Thread(() => 
{ 
    waitWindow.Show(); 
    System.Windows.Threading.Dispatcher.Run(); 
}); 

newWindowThread.SetApartmentState(ApartmentState.STA); 
newWindowThread.IsBackground = true; 
newWindowThread.Start(); 

ExcelExport(); 

waitWindow.Close(); 

ですが、これはエラーになります。

The calling thread cannot access this object because a different thread owns it.

Excelの方法がエクスポートしている間、アニメーションが凍結しないように、どのように私は、新しいスレッドを開始することができますか?

+5

私は別のスレッドで 'ExcelExport'メソッドを実行しないのはなぜエクスポート操作は、非UIスレッド – tym32167

+2

で行われるべきだと思いますか? – JanDotNet

答えて

1

ウィンドウの作成を新しいスレッドに移動する必要があります。ShowDialogを使用して、それ自身のDispatcherでブロックして閉じることを確認してください。

PleaseWaitWindow waitWindow = null; 

var newWindowThread = new Thread(() => 
    { 
     waitWindow = new PleaseWaitWindow(); 
     waitWindow.ShowDialog(); 
    } 
); 

newWindowThread.SetApartmentState(ApartmentState.STA); 
newWindowThread.Start(); 

ExcelExport(); 

waitWindow.Dispatcher.BeginInvoke(new Action(() => 
{ 
    waitWindow.Close(); 
})); 

だけwaitWindowが、それを閉じようとする前に作成され、IPC障壁のいくつかの種類がここで良いだろうことを確認してください。例えば、(迅速かつ汚い):

PleaseWaitWindow waitWindow = null; 
AutoResetEvent loaded = new AutoResetEvent(false); 

var newWindowThread = new Thread(() => 
    { 
     waitWindow = new PleaseWaitWindow(); 
     loaded.Set(); 
     waitWindow.ShowDialog(); 
    }); 

newWindowThread.SetApartmentState(ApartmentState.STA); 
newWindowThread.Start(); 

ExcelExport(); 

loaded.WaitOne(); 

waitWindow.Dispatcher.BeginInvoke(new Action(() => 
{ 
    waitWindow.Close(); 
})); 
関連する問題