0

深刻な問題があります。私は現在パッチャープログラムを行っています。
プログラムには「パッチ」ボタンがあり、ユーザーがそれをクリックすると、ダウンロードが開始されます。
現在、プログラムがダウンロードする必要がある 5 つのファイルがあります。ダウンロードは正しく、プログラムのこの部分は機能していますが、[パッチ] ボタンをクリックすると、プログラムが遅くなり始め、プログラムを閉じたり、位置を変更したりできません。コードは次のとおりです。

private void button1_Click(object sender, EventArgs e) { Thread thread = new Thread(new ThreadStart(this.download)); スレッド.開始(); }

    public void download()
    {
        int downloaded = 0;
        int all = 5;
        WebClient myWebClient = new WebClient();

        if (button1.InvokeRequired)
        {
            MethodInvoker MethodControll = new MethodInvoker(download);
            this.button1.Invoke(MethodControll);
        }
        else
        {

            double state;
            jelenlegidownload.Text = "alut.dll";
            myWebClient.DownloadFile(Files.alutDLL, "alut.dll");
            downloaded++;
            state = downloaded / all * 100;
            progressBar.Value = Convert.ToInt32(state);
            progressBar.Refresh();
            this.Refresh();  

            jelenlegidownload.Text = "BlackBox.dll";
            myWebClient.DownloadFile(Files.BlackBoxDLL, "BlackBox.dll");
            downloaded++;
            state = downloaded / all * 100;
            progressBar.Value = Convert.ToInt32(state);
            progressBar.Refresh();
            this.Refresh();

            jelenlegidownload.Text = "DevIL.dll";
            myWebClient.DownloadFile(Files.DevILDLL, "DevIL.dll");
            downloaded++;
            state = downloaded / all * 100;
            progressBar.Value = Convert.ToInt32(state);
            progressBar.Refresh();
            this.Refresh();

            jelenlegidownload.Text = "fltkdll.dll";
            myWebClient.DownloadFile(Files.fltkdllDLL, "fltkdll.dll");
            downloaded++;
            state = downloaded / all * 100;
            progressBar.Value = Convert.ToInt32(state);
            progressBar.Refresh();
            this.Refresh();

            jelenlegidownload.Text = "glut32.dll";
            myWebClient.DownloadFile(Files.glut32DLL, "glut32.dll");
            downloaded++;
            state = downloaded / all * 100;
            progressBar.Value = Convert.ToInt32(state);
            progressBar.Refresh();
            this.Refresh();

Files.cs:

public class Files
{
    public static string alutDLL = "https://dl.dropbox.com/s/62tt9w194xefk7t/alut.dll?token_hash=AAHQmybYdR44TRrS9bWQWV7jlZBzZQ-mmmjNy1Kv_qR4cg&dl=1";
    public static string BlackBoxDLL = "https://dl.dropbox.com/s/vtdrl8qdpky8p08/BlackBox.dll?token_hash=AAHCtQPBJ5s-3aL5B4FqrmOUIGP6BVvW8ZQeWd-xBzysTw&dl=1";
    public static string DevILDLL = "https://dl.dropbox.com/s/spni307vmk4zng9/DevIL.dll?token_hash=AAEmZdQj3dv2NIEh6tcWwkgyJHCytSsX65QXZyNGY2Vl1w&dl=1";
    public static string fltkdllDLL = "https://dl.dropbox.com/s/fsa29pelfwgk5ha/fltkdll.dll?token_hash=AAF55SuU_8bfli5gIiPpA-VLWUmZKLbOK-Ys8iokuJ8_XA&dl=1";
    public static string glut32DLL = "https://dl.dropbox.com/s/cptiwxv17nhtywp/glut32.dll?token_hash=AAGCNXQPpwrByjp-uG_avBbkNyNjTfOJFxbY3ieNAfLzVw&dl=1";
}

ラグを修正するにはどうすればよいですか?(前に言ったように、「パッチ」ボタンをクリックすると、ファイルはダウンロードされますが、プログラムは「停止」します)

4

2 に答える 2

1

アプリケーションのダウンロード部分を停止してアプリケーションの UI 部分をブロックするには、別のスレッドでダウンロード ジョブを実行してみませんか。これにより、ダウンロードが完了していない場合でも、UI は引き続き応答します。

編集:これはあなたのケースに当てはまる素晴らしい記事だと思います:

http://www.developerfusion.com/article/4134/net-threading-part-i/

于 2013-02-22T14:19:42.700 に答える
0

あなたは誤解していると思いますInvokeRequired

MSDNから:

呼び出し元がコントロールが作成されたスレッドとは異なるスレッド上にあるため、呼び出し元がコントロールへのメソッド呼び出しを行うときに、呼び出し元メソッドを呼び出す必要があるかどうかを示す値を取得します。

基本的に、別のスレッドでダウンロードを開始します。ただし、これInvokeRequiredによりtrueが発生するため、GUIスレッドでメソッドを呼び出して、アプリケーションをロックします。

このセクションを削除すると、うまく機能しますか?

    if (button1.InvokeRequired)
    {
        MethodInvoker MethodControll = new MethodInvoker(download);
        this.button1.Invoke(MethodControll);
    }

更新 プログレスバーで何か間違ったことをしていることを除外するには、ダウンロード方法を次のように単純化してみてください。

public void download()
{
    WebClient myWebClient = new WebClient();

    myWebClient.DownloadFile(Files.alutDLL, "alut.dll");
    myWebClient.DownloadFile(Files.BlackBoxDLL, "BlackBox.dll");
    myWebClient.DownloadFile(Files.DevILDLL, "DevIL.dll");
    myWebClient.DownloadFile(Files.fltkdllDLL, "fltkdll.dll");
    myWebClient.DownloadFile(Files.glut32DLL, "glut32.dll");
}

これにより、ファイルが遅れることなくダウンロードされるはずですが、プログレスバーに更新が表示されるようにします(明らかに)。

于 2013-02-22T14:25:38.790 に答える