首页 文章

C#下载延迟

提问于
浏览
0

我有一个严重的问题 . 我正在做一个修补程序 .
程序中有一个"Patch"按钮,如果用户单击它,则开始下载 .
目前该程序需要下载5个文件 . 下载是正确的,这部分程序正在运行但是当我点击Patch按钮时,程序开始滞后,我可以't close, or change the position of it. Here' s代码:

private void button1_Click(object sender,EventArgs e){Thread thread = new Thread(new ThreadStart(this.download)); thread.Start(); }

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";
}

我怎样才能解决滞后问题? (正如我之前所说,如果我点击“补丁”按钮,文件正在下载,但程序“停止”)

2 回答

  • 1

    要阻止应用程序的下载部分阻止应用程序的UI部分,为什么不在其他线程上执行下载作业 . 这样,即使下载尚未完成,您的UI仍将保持响应 .

    编辑:我认为这是一篇适用于您案例的精彩文章:

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

  • 0

    我想你误解了 InvokeRequired .

    来自MSDN

    获取一个值,该值指示调用者在对控件进行方法调用时是否必须调用invoke方法,因为调用者与创建控件的线程不在同一个线程上 .

    基本上,您在另一个线程上开始下载 . 但由于这会导致 InvokeRequired 为真,因此您可以回想一下GUI线程上的方法,即锁定应用程序 .

    如果删除此部分,它会更好吗?

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

    Update 要排除您的进度条出错,请尝试将下载方法简化为:

    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");
    }
    

    这应该使文件下载没有延迟,但您希望在进度条中看到任何更新(显然) .

相关问题