【问题标题】:RestSharp DownloadData sync with progressbarRestSharp 下载数据与进度条同步
【发布时间】:2016-07-11 19:07:41
【问题描述】:

如何在窗体应用程序中通过 ProgressBar 下载文件并显示下载进度?

RestClient client = new RestClient("http://127.0.0.1/");

RestRequest request = new RestRequest("/test/{FileName}");
request.AddParameter("FileName", "testFile.abc", ParameterType.UrlSegment);

string path = @"C:/Users/[user]/Desktop/testFile.abc";

var fileForDownload = client.DownloadData(request);

fileForDownload.SaveAs(path);

if (File.Exists(@"C:/Users/[user]/Desktop/testFile.abc"))
{
    MessageBox.Show("done");
}

我写了一些这样的想法,但我不知道现在是什么?

【问题讨论】:

    标签: c# restsharp


    【解决方案1】:

    我认为更好的选择是覆盖 FileStream 以获取写入文件的字节数:

    string tempFile = Path.Combine(Configuration.DownloadFolder, "TEST.DATA");
    using (var writer = new HikFileStream(tempFile))
    {
        writer.Progress += (w, e) => {
    #if DEBUG
            Console.Write(string.Format("\rProgress: {0} / {1:P2}", writer.CurrentSize, ((double)writer.CurrentSize) / finalFileSize));
    #endif
        };
        request.ResponseWriter = (responseStream) => responseStream.CopyTo(writer);
        var response = client.DownloadData(request);
    }
    

    HikFileStream 在哪里:

    class HikFileStream : FileStream
    {
        public HikFileStream(string path)
            : base(path, FileMode.Create, FileAccess.Write, FileShare.None)
        {
        }
    
        public long CurrentSize { get; private set; }
    
    
        public event EventHandler Progress;
    
        public override void Write(byte[] array, int offset, int count)
        {
            base.Write(array, offset, count);
            CurrentSize += count;
            var h = Progress;
            if (h != null)
                h(this, EventArgs.Empty);//WARN: THIS SHOULD RETURNS ASAP!
        }
    
    }
    

    【讨论】:

    • 这对我不起作用。似乎 RestSharp 仅在下载完成之后执行 ResponseWriter 操作。
    【解决方案2】:

    抱歉,您不能,因为 RestClient 中没有事件处理程序对象来获取下载数据的状态。

    这是另一种方法;

            //...
            timer1.Interval = 1000; // 1 sec interval.
    
            timer1.Start();
    
            RestClient client = new RestClient("http://127.0.0.1/")
                                {
                                    Timeout = 10 * 1000 //10 sec timeout time.
                                };
    
            RestRequest request = new RestRequest("/test/{FileName}");
            request.AddParameter("FileName", "testFile.abc", ParameterType.UrlSegment);
    
            string path = @"C:/Users/[user]/Desktop/testFile.abc";
    
            var fileForDownload = client.DownloadData(request);
    
            fileForDownload.SaveAs(path);
    
            if (File.Exists(@"C:/Users/[user]/Desktop/testFile.abc"))
            {
                MessageBox.Show("done");
            }
    
            progressBar1.Value = 100;
            timer1.Stop();
        }
    
        public void timer1_Tick(object sender, EventArgs e)
        {
            if (progressBar1.Value <= 100)
            {
                progressBar1.Value += 10;
            }
    
            if (progressBar1.Value >= 100)
            {
                progressBar1.Value = 0;
            }
        }
    

    为命名最佳实践更改“timer1”的名称。祝你好运...

    【讨论】:

    • 这个答案显示了如何为一个恒定的 10 秒间隔计时。它实际上并没有说明下载了多少数据。
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多