2017-11-04 4 views
0

richtextboxといくつかのファイルが存在するかどうかをチェックし、結果をrichtextboxに表示するボタンが付いたC#小さなアプリをやっています。c#onclickイベントが完了するのを待ってテキストを追加します

private void RunButton_Click(object sender, EventArgs e) 
{ 
     myRichTextBox.AppendText("Starting..."); 

     if (checkFileExists()) 
     { 
      myRichTextBox.AppendText("File exists."); 
     } 
     else 
     { 
      myRichTextBox.AppendText("File NOT exists!"); 
     } 
} 

私が直面しています問題は、テキストがcheckFileExists()が終了したときに、リッチテキストボックスに追加された「...起動」ということです。これには時間がかかることがあるので、最初に「Starting」メッセージを表示し、checkFileExistsが終了したら残りのテキストメッセージを表示したいと考えています。

あなたは私を助けることができますか?

ありがとうございます!

+0

BackgroundWorkerクラスがどのように役立つかを調べる必要があります。コードがイベントハンドラに入ると、UI外観に加えた変更は、イベントハンドラを終了するまで実行されません。 – Steve

+0

私はディスク内のファイルを.NETでチェックしていると非同期ですので、非同期で使用することができます – miechooy

+0

あなたの答えはスティーブとmiechooyに感謝します。私は必要なものを説明しているこのビデオを見つけました:https://www.youtube.com/watch?v=C5VhaxQWcpE – AlexS

答えて

0

メインスレッドにテキストを設定してから、実行中のプロセス(ファイルが存在するかどうかを確認する)を別のスレッドに開始する必要があります。完了したら、テキストを結果で更新できますが、メイン(UI)スレッドにマーシャリングする必要があります。

これは1つの方法です。

private void button1_Click(object sender, EventArgs e) 
{ 
    button1.Text = "Starting..."; 

    var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); 

    Task.Factory.StartNew(() => CheckIfFileExists(uiScheduler)); 
} 

private async Task CheckIfFileExists(TaskScheduler uiScheduler) 
{ 
    await Task.Delay(2000); 

    var exists = true; // check if exists 

    await Task.Factory.StartNew(() => UpdateText(exists), CancellationToken.None, TaskCreationOptions.None, uiScheduler).ConfigureAwait(false); 
} 

private void UpdateText(bool exists) 
{ 
    button1.Text = $"Exists: {exists}."; 
} 
+0

こんにちはPeteGo、あなたの答えに感謝します。私はあなたが探していたもの(https://www.youtube.com/watch?v=C5VhaxQWcpE)を説明しているYouTubeのビデオを見つけましたが、自分のニーズに合っていると思うので、私はあなたのソリューションをテストします。 – AlexS

関連する問題