1

私はビジュアルスタジオ2008フレームワーク3.5にWindowsアプリケーションを持っています。プロセスがウィンドウで進行している同時待機ウィンドウが必要で、そのウィンドウに.gif画像のような動画(アニメーション)で別のフォームが表示されます。

form2 に 2 つのフォームがあり、ボタンをクリックすると長いプロセスが実行されます。form2 のプロセスが進行している間は「frmWait」が画面に表示され、終了すると消えます。「frmWait」が表示されると、ユーザーはフォーム 2 にアクセスできなくなります。

私のコードはここにあります。フォーム2

SomeWork プロシージャには、私が書いた for ループがありますが、実際には、プログラムでは sqlserver で実行されるデータベース コマンドです。クエリがサーバー上で実行されると、私のメイン プログラムの動作は、サーバーの動作が終了するまで停止し、その後、プログラムは実行ポインタを取得します。 、ソフトウェアがハングしているようです。

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

            private void button1_Click(object sender, EventArgs e)
            {
                frmWait fw = new frmWait("Wait...",0);
                fw.Show();

                SomeWork();

                fw.Close();
            }

            private void SomeWork()
            {
                for (int x = 0; x < 99999999; x++)
                { }
            }
        }
    }
4

6 に答える 6

3

最初に追加..

using System.Threading;

上記のコードを別のスレッドを使用するように調整しました..

private void button1_Click(object sender, EventArgs e) 
{ 
    this.SomeWork();             
}

Thread t;

private void SomeWork()
{
    frmWait fw = new frmWait("Wait...", 0);

    this.t = new Thread((ThreadStart)delegate()
    {

        for (int x = 0; x < 99999; x++)
        {
            Thread.Sleep(100);

            //Debug.WriteLine(x);
        }


        if (this != null && !this.IsDisposed) this.BeginInvoke((ThreadStart)delegate() { fw.Close(); });
    });

    this.t.Start();

    fw.ShowDialog(this);
}

ユーザーが完了前に Form2 を閉じることを許可されている場合は、FormClosing イベントを処理してスレッドを強制終了することもできます。

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
    if (t != null && t.IsAlive) t.Abort();
} 
于 2012-04-25T03:44:01.630 に答える
3

時間のかかるプロセスはバックグラウンド スレッドで実行する必要があります。これは、 BackgroundWorkerを使用して簡単に実現できます。

ワーカーが起動したら、 を使用して frmWait を表示するだけfrmWait.ShowDialog()です。

ワーカーがジョブの終了を通知したら、たとえば を使用して frmWait を閉じfrmWait.DialogResult=Cancelます。

このProgressChangedイベントを利用して、frmWait で進行状況を報告できます。

ユーザーが frmWait で [キャンセル] ボタンをクリックした場合はCancelAsync()、バックグラウンド ワーカーを呼び出すだけです。

完全なサンプルはこちら.

于 2012-01-20T06:42:03.963 に答える
2

.NET 4 では、このようなタスクを簡単にする Task Parallel Library が導入されました。BackgroundWorker を使用する代わりに、System.Threading.Tasks.Taskを使用する必要があります。この質問への回答に詳細があります: BackgroundWorker のタスク並列ライブラリの置き換え?

于 2012-01-20T07:09:57.463 に答える
0

このシナリオではBackgroundWorkerを使用しSomeWorkて、メイン UI スレッドからパーツを移動する必要があります

SomeWork();の別DoWorkのメソッドにパーツを移動しBackgroundWorkerます。このようにして、別のバックグラウンド スレッドでSomeWork実行されます。BackgroundWorker次に、完了したらBackground Work Completed発生するイベントで実行しますSomeWorkfw.Close();

于 2012-01-20T06:42:26.280 に答える
-1

モーダルダイアログボックスを使用できます。他のフォーム (つまり、form2) との対話は許可されないためです。

frmWait.ShowDialog();

また、バックグラウンド ワーカーbackground workerを使用してみてください。これにより、バックグラウンド プロセスがより簡単になります。

于 2012-01-20T06:42:06.410 に答える
-1

私はあなたが何を意味するのか正確にはわかりませんでしたが、frmWait が開くまで Form2 にアクセスできないようにする場合は、frmWait.ShowDialog() を使用し、特定のプロセスが終了したときに frmWait を閉じたい場合は、 frmWait では、以下を使用します

Process.WaitForExit();
this.Close();
于 2012-01-20T06:48:23.197 に答える