-1

フォームロードイベントで長いプロセスを実行しているフォームが1つあります。 フォームロードイベント中にOne Gifイメージ "Please Wait"を表示します。フォームロードイベント中に待機中のGifイメージを表示する方法

以下はコードです。 Thread.start後

private void frmWaitShow() 
     { 
      try 
      { 
       frmWaitwithstatus objWait = new frmWaitwithstatus();// this form has Gif Image for Processing 
       objWait.lblStatus.Text = "Processing Request, Please wait..."; 
       objWait.ShowDialog(); 
      } 
      catch (Exception ex) 
      { 
       Logger.SystemException(ex); 
       Logger.FTSError(" ERROR :" + ex.Message + "frmTest || frmWaitShow"); 

      } 
     } 


     Thread oThread; 
     private void frmTest_Load(object sender, EventArgs e) 
     { 
      try 
      { 


       oThread = new Thread(new ThreadStart(frmWaitShow)); 
       oThread.Start(); 

       //Functions for Connection with devices 
       if (LoadDatafromDB() == false) return; 
       if (ElectTestLoad() == false) return; 
       if (PowerOnSelfTest() == false) { return; } 
       InitiControlsElectTest(); 
       SetSystemMode(SystemMode.ElectricalMode); 

       oThread.Abort(); 
      } 
      catch (Exception ex) 
      { 
       oThread.Abort(); 
       Logger.SystemException(ex); 

      } 
     } 

()私のデバッガは、メインとそれが行の下に移動した後、私が作成したが、1つのスレッドごとに1一歩を行きます。

frmWaitwithstatus.csコンストラクタ最初の行

public frmWaitwithstatus() 

それは、後にのみ、それは(GIF処理画像である)私のスレッドを実行して起動し、私のスレッドを実行して停止し、完全なメインスレッドの実行後にメインスレッドのすべての機能を実行します。

+0

使用タスクと非同期/待機待ちのパスに従う –

+0

[クロススレッド操作が有効でない:作成されたスレッド以外のスレッドからアクセスされたコントロール](https://stackoverflow.com/questions/142003/cross-thread-operation) - なし-valid-control-accessible-from-the-thread-other-than-the) – MickyD

+0

@MickyDいいえ、そうではありません。私は別のスレッドでUIコントロールを処理する方法を知っている、ここで私はスレッドからGIF画像を持つ別のフォームを呼び出しています。 –

答えて

2

非同期/待つパターンは、この簡単な作業とすべてのフォームは、UIスレッド上で動作します行われます使用:

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

    private async void Form1_Load(object sender, EventArgs e) 
    { 
     // async show loading form dialog 
     var loadingForm = new LoadingForm(); 
     var loadingDialogTask = this.InvokeAsync(loadingForm.ShowDialog); 

     // async loading data 
     var data = await LoadDataAsync(); 
     listBox1.DataSource = data; 

     loadingForm.Close(); 
     await loadingDialogTask; 
    } 

    private async Task<ICollection<string>> LoadDataAsync() 
    { 
     // fake work load 
     await Task.Delay(4000).ConfigureAwait(false); 
     return Enumerable.Range(1,20000).Select(e => e.ToString()).ToList(); 
    } 

} 

コントロールするために必要な非同期拡張子:

public static class ControlAsyncExtensions 
{ 
    public static Task InvokeAsync(this Control control, Action action) 
    { 
     var tcs = new TaskCompletionSource<bool>(); 
     control.BeginInvoke(new Action(() => 
     { 
      try 
      { 
       action(); 
       tcs.SetResult(true); 
      } 
      catch (Exception ex) 
      { 
       tcs.SetException(ex); 
      } 
     } 
     )); 
     return tcs.Task; 
    } 

    public static Task<T> InvokeAsync<T>(this Control control, Func<T> action) 
    { 
     var tcs = new TaskCompletionSource<T>(); 
     control.BeginInvoke(new Action(() => 
     { 
      try 
      { 
       tcs.SetResult(action()); 
      } 
      catch (Exception ex) 
      { 
       tcs.SetException(ex); 
      } 
     } 
     )); 
     return tcs.Task; 
    } 
} 
+0

あなたは正しいです – MickyD

関連する問題