-1

WinForm C# アプリケーションがあり、プログラムで pdf ファイルを生成し、電子メールで送信しています。ステータス (ファイルの生成中、送信中、送信成功、失敗) を示すステータス ラベルを表示しようとしています。ただし、最後のステータス(送信成功)のみが表示されます。ステータスの更新を表示するにはどうすればよいですか?

以下のコードを試しました。

try
  {                
      Status_Label.Invoke((MethodInvoker)(() => Status_Label.Text ="Generating PDF fie..."));

      /*
      GENERATING CODE TO CREATE PDF FILE
      */

      Status_Label.Invoke((MethodInvoker)(() => Status_Label.Text = "Sending Email..."));

       /*
      GENERATING CODE for sending the Email
      */

      Status_Label.Invoke((MethodInvoker)(() => Status_Label.Text = "Sent successfully."));


  }
  catch (Exception ex)
  {  
       Status_Label.Invoke((MethodInvoker)(() => Status_Label.Text = "Sending failed."));
  }
4

4 に答える 4

3

それは間違っている。このようなものには a を使用する必要がありますBackgroundWorker。別のスレッドで実行されますが、進行状況を呼び出しスレッド (多くの場合 UI スレッド) に公開できます。

于 2013-07-24T07:04:34.217 に答える
1

これは、GUI スレッドがすべての作業を行っており、メソッドでスタックしている間は GUI が更新されないためです。コマンドで GUI の更新を行っても機能しません。そのため、PDF の生成と電子メールの送信を独自のスレッドに入れる必要があります。新しいスレッドによっていっぱいになっている (同期された!) キューを読み取る GUI スレッドでタイマーをアクティブにします。キューに新しい要素がある場合は、スレッドが終了するまでラベルにその内容を入力し、その時点でタイマーを停止します。

于 2013-07-24T07:00:09.197 に答える
0

タグを除いて、あなたの質問はマルチスレッドについて言及していません。現在、UI スレッドでこのすべての生成を行っていますか? (つまり、ボタン クリックなどの登録済みイベントの直接的な結果として。) その場合、問題は、UI が再度更新される前にすべてのコードが実行されることです。

これ1 つのスレッドでのみ実行されている場合は、変更Status_Label.Textしてから を呼び出しますApplication.DoEvents()。これにより、アプリケーションはキューに入れられた他の UI イベントを処理し、関数に戻ります。

于 2013-07-24T07:05:36.423 に答える