2012-03-05 8 views
2

私はC#を使用しているWinFormsアプリケーションを持っています。私はファイルからいくつかのデータを読み込み、それをデータテーブルに挿入しようとします。この操作がビジー状態では、フォームがフリーズし、イベントを移動できません。誰も私はこの問題を解決する方法を知っていますか?操作がビジー状態の間、フォームは何もしません(フリーズ)

+0

あなたの言うことを混乱させる。 – joshua

答えて

9

これは、UIスレッドで操作したためです。

UIスレッドがフリーズしないように、ファイルとデータベースのアクションを別のスレッドに移動します。

ここにThreadPoolを使用した例があります。 代わりに、手作業でスレッドを開始することもできますが、手動でスレッドを手動で追跡する必要があります。それらを中止したいなど

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Threading; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
     InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
     // With ThreadPool 
     ThreadPool.QueueUserWorkItem(DoWork); 
     } 

     private void DoWork(object state) 
     { 
     // Do Expensive Work 
     for (int i = 0; i < 100; i++) 
     { 
      Thread.Sleep(10); 
     } 
     System.Diagnostics.Debug.WriteLine("DoWork finished!"); 
     } 

    } 
} 
+0

回答ありがとうございますが、コード – namco

0

Tasksを使用します。すなわち

Task.Factory.StartNew(() => DoAction()).ContinueWith(() => DoAfterActionIsComplete()); 
+0

で表示できますか? – namco

1

これは、メインスレッドを使用して時間がかかるためです。最適な解決策は、必要なファイルの読み込みに別のスレッドを使用することです。これにより、メインスレッドは正常に更新されます。 は、複数のスレッドhttp://msdn.microsoft.com/en-us/library/aa645740%28v=vs.71%29.aspxについてはこちらを読む

1

あなたのUI関連のコントロールがUI thread上で実行され、原則として、あなたは(あなたがそれを行う場合は、あなたのUIスレッドがそのタスクまで/凍結をブロックしますあなたのUIスレッド上で作業を消費する時間を行うべきではありません完了)。 Worker Threadと呼ばれる別の種類のスレッドが作成でき、UIの応答性を維持する/実行しないで長期間実行するタスクを実行できます。 Threading in Windows Formsの使い方について説明します。

また、WinformsにBackgroundworker componentがあります。これは、hereで説明されているUI以外のスレッドでタスクを実行するために利用できます。

関連する問題