2017-11-08 8 views
0

私の問題に関連するいくつかの質問があることを知っています。私はそれらをすべて勉強しましたが、まだそれを得ることはできないようです。 何かlike thisまたはlike thisメインスレッドの実行中に制御プロパティを変更するにはどうすればよいですか?

私は、FTP経由でいくつかのファイルをダウンロードする方法があります(約5秒かかります)。ボタンをクリックしてファイルをダウンロードすると、コントロールのプロパティを変更して、読み込み中のものが表示されるようにします。

このため、私はCircleProgressBarに "animated"プロパティをデフォルトでfalseに設定しています。以前のメソッドを呼び出すと、まずそのプロパティをtrueに変更し、ダウンロードが完了した後でfalseに戻す必要があります。

私は多くのソリューションを試みたが、無駄に:

void UpdateMessage(bool value) 
    { 
     Action action =() => DownloadLC_Normal_CircleProgressBar.animated = value; 
     Invoke(action); 
    } 
    private void DownloadLC_Normal_Button_Click(object sender, EventArgs e) 
    { 
     // try 1 
     //UpdateMessage(true); 

     // try 2 
     //DownloadLC_Normal_CircleProgressBar.Invoke((MethodInvoker)(() => 
     //{ 
     // DownloadLC_Normal_CircleProgressBar.animated = true; 
     //})); 

     // try 3 
     if (DownloadLC_Normal_CircleProgressBar.InvokeRequired) 
     { 
      DownloadLC_Normal_CircleProgressBar.BeginInvoke((MethodInvoker)delegate() { DownloadLC_Normal_CircleProgressBar.animated = true; }); 
     } 
     else 
     { 
      DownloadLC_Normal_CircleProgressBar.animated = false; 
     } 

     // DOWNLOAD FILES THROUGH FTP BY CALLING A METHOD FROM A .cs FILE 
     // FROM THE PROJECT 

     //UpdateMessage(false); 
     //DownloadLC_Normal_CircleProgressBar.animated = false; 
    } 

CircleProgressBarをアニメーション化することはありません。私は何が欠けていますか?私は間違って何をしていますか? :(

EDIT: コードの私の欠けている部分:最も簡単なオプションの

ftp ftpClient = new ftp("ftp://" + "192.168.1.200" + "/", "anonymous", "anonymous"); 
NetworkCredential credentials = new NetworkCredential("anonymous", "anonymous"); 
string url = "ftp://" + "192.168.1.200" + "/Documents and Settings/"; 
ftpClient.DownloadFtpDirectory(url, credentials, newDirectoryDownloadLocation); 
+0

ダウンロード方法はどこですか?私はあなたがダウンロードのUIスレッドをロックする同期呼び出しを行っていると思いますので、ダウンロードが完了するまでUIアップデートはありません。 –

+2

これはスレッドの問題であるかどうかわかりません。ロジック問題のようなもの。あなたのDownloadLC_Normal_Button_ClickがUIイベントから呼び出されたように見えます - ボタンがクリックされたとき、そうですか?その場合、DownloadLC_Normal_CircleProgressBar.InvokeRequiredはfalseを返します。これは実行される唯一の行がDownloadLC_Normal_CircleProgressBar.animated = falseであることを意味します。私は、try/3セクションの2行にブレークポイントを置き、実際に何が実行されるかを確認することをお勧めします。お役に立てれば。 AB –

+0

今私はこの行を見ましたが、それもそうかもしれません:else { DownloadLC_Normal_CircleProgressBar.animated = false;代わりにDownloadLC_Normal_CircleProgressBar.animated = trueにする必要があります。 –

答えて

2

私はあなたがフレームワークを使用していると仮定しています4.5/higherまたは4.0 with Microsoft.Bcl.Async installed ok。

試用版:

private async void DownloadLC_Normal_Button_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     DownloadLC_Normal_Button.Enabled = false; 
     DownloadLC_Normal_CircleProgressBar.animated = true; 

     ftp ftpClient = new ftp("ftp://" + "192.168.1.200" + "/", "anonymous", "anonymous"); 
     NetworkCredential credentials = new NetworkCredential("anonymous", "anonymous"); 
     string url = "ftp://" + "192.168.1.200" + "/Documents and Settings/"; 

     //the code you post + change this line from: 

     //ftpClient.DownloadFtpDirectory(url, credentials, newDirectoryDownloadLocation); 

     //to: It makes the call be async 

     await Task.Run(() => ftpClient.DownloadFtpDirectory(url, credentials, newDirectoryDownloadLocation)); 
    } 
    finally 
    { 
     DownloadLC_Normal_CircleProgressBar.animated = false; 
     DownloadLC_Normal_Button.Enabled = true; 
    } 
} 
+2

はい、私は4.5を使用し、それは動作します。私がSinatrにも言ったように、DownloadLC_Normal_Button.Enabled = false;メソッドが実行されている間(4〜5秒)、背景、フレーム、および色を破壊します。しかし、それは仕事をします。ありがとう、ヴィニシウス! – Marko

+0

あなたは大歓迎です!あなたのために働く場合anwerとしてマーク! Tks –

2

一つは、非同期/のawait使用することです:

async void DownloadLC_Normal_Button_Click(object sender, EventArgs e) 
{ 
    DownloadLC_Normal_CircleProgressBar.animated = true; 
    DownloadLC_Normal_Button.Enabled = false; // prevent further clicks 
    await Task.Run(() => 
    { 
     ... // long running code, use `Invoke` to update UI controls 
    }); 
    DownloadLC_Normal_CircleProgressBar.animated = false; 
    DownloadLC_Normal_Button.Enabled = true; 
} 
+0

私はあなたのアプローチをテストしました。実際には、DownloadLC_Normal_Button.Enabled = falseのために背景と色が乱れてしまいます。もの。私にそれを少し説明してください、それの背後にある論理についてのいくつかの参考文献を投稿してください。 – Marko

+0

単語が分かっているのであなた自身で探すことができます;)[this](https://docs.microsoft.com/en-us/dotnet/csharp/async)または[this](https:// msdn.microsoft.com/library/hh191443(vs.110).aspx)msdnの説明が優れています。フラグを使用すると、別のタスクが作成されないようにすることができます。前のタスクは終了しません。ある期間(本当に推奨されていない)UIをブロックしたいのであれば、簡単な回避策は、同期アップデートUIの後に 'Application.DoEvents()'を呼び出すことです。 – Sinatr

+0

これは、App.DoEvents()を使用してジョブをキューから取り出すという私の最初のアプローチでした。それでは、コントロールのプロパティ、App.DoEvents()を変更してからFTPをダウンロードし、UIを元に戻してください。それは働かなかった、私は理由を知らない。 – Marko

関連する問題