天道酬勤,学无止境

How to show progress of reading from a file and writing to a database

问题

我有以下从按钮单击调用的函数。 该函数读取文件,然后尝试写入 SQL 表:

public void saveCSV()
{
    lblCSVStatus.Text = "";
    worker = new BackgroundWorker { WorkerReportsProgress = true };
    worker.DoWork += (sender, args) =>
    {
        tbTable.Invoke((MethodInvoker)delegate
        {
            tbTable.Enabled = false;
        });

        myConnection = new SqlConnection(cString);
        myConnection.Open();

        /* BEGIN READING CSV FILE */
        StreamReader sr = new StreamReader(tbCSVFileLocation.Text.ToString());
        string line = sr.ReadLine();
        string[] value = line.Split(',');
        DataTable dt = new DataTable();
        DataRow row;

        foreach (string dc in value)
        {
            dt.Columns.Add(new DataColumn(dc));
        }

        while (!sr.EndOfStream)
        {
            value = sr.ReadLine().Split(',');
            if (value.Length == dt.Columns.Count)
            {
                row = dt.NewRow();
                row.ItemArray = value;
                dt.Rows.Add(row);
            }
        }
        /* END READING CSV FILE */

        /* CREATE TABLE IF DOESN'T EXIST AND WRITE (APPEND/OVERWRITE) THE DATA */
        string exists = null;
        try
        {
            SqlCommand cmd = 
                new SqlCommand("SELECT * FROM sysobjects where name = '" + tbTable.Text + "'",
                               myConnection);
            exists = cmd.ExecuteScalar().ToString();
        }
        catch (Exception exce)
        {
            exists = null;
        }

        if (exists == null)
        {
            foreach (DataColumn dc in dt.Columns)
            {
                if (exists == null)
                {
                    SqlCommand createtable =
                        new SqlCommand("CREATE TABLE " + tbTable.Text + " (" + dc.ColumnName + " varchar(MAX))",
                                       myConnection);
                    createtable.ExecuteNonQuery();
                    exists = tbTable.Text;
                }
                else
                {
                    SqlCommand addcolumn =
                        new SqlCommand("ALTER TABLE " + tbTable.Text + " ADD [" + dc.ColumnName + "] varchar(MAX)",
                                       myConnection);
                    addcolumn.ExecuteNonQuery();
                }
            }

            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(myConnection))
            {
                try
                {
                    bulkCopy.DestinationTableName = tbTable.Text;
                    bulkCopy.WriteToServer(dt);
                    lblCSVStatus.Invoke((MethodInvoker)delegate
                    {
                        lblCSVStatus.Text = "Successfully Updated " + tbTable.Text + " Table";
                        lblCSVStatus.ForeColor = System.Drawing.Color.Green;
                    });
                    tbTable.Invoke((MethodInvoker)delegate
                    {
                        tbTable.Enabled = true;
                    });
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message.ToString(),
                                    "Program Error",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Exclamation);
                    lblCSVStatus.Invoke((MethodInvoker)delegate
                    {
                        lblCSVStatus.Text = "Failed to Update " + tbTable.Text + " Table";
                        lblCSVStatus.ForeColor = System.Drawing.Color.Red;
                    });
                    tbTable.Invoke((MethodInvoker)delegate
                    {
                        tbTable.Enabled = true;
                    });
                }
            }
        }
        else
        {
            if (rbAppend.Checked == true)
            {
                using (SqlBulkCopy bulkcopy = new SqlBulkCopy(myConnection))
                {
                    try
                    {
                        bulkcopy.DestinationTableName = tbTable.Text;
                        bulkcopy.WriteToServer(dt);
                        lblCSVStatus.Invoke((MethodInvoker)delegate
                        {
                            lblCSVStatus.Text = "Successfully Updated " + tbTable.Text + " Table";
                            lblCSVStatus.ForeColor = System.Drawing.Color.Green;
                        });
                        tbTable.Invoke((MethodInvoker)delegate
                        {
                            tbTable.Enabled = true;
                        });
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message.ToString(),
                                        "Program Error",
                                        MessageBoxButtons.OK,
                                        MessageBoxIcon.Exclamation);
                        lblCSVStatus.Invoke((MethodInvoker)delegate
                        {
                            lblCSVStatus.Text = "Failed to Update " + tbTable.Text + " Table";
                            lblCSVStatus.ForeColor = System.Drawing.Color.Red;
                        });
                        tbTable.Invoke((MethodInvoker)delegate
                        {
                            tbTable.Enabled = true;
                        });
                    }
                }
            }
            if (rbUpdate.Checked == true)
            {
                SqlCommand truncateTable = new SqlCommand("TRUNCATE TABLE " + tbTable.Text + "",
                                                          myConnection);
                truncateTable.ExecuteNonQuery();
                using (SqlBulkCopy bulkcopy = new SqlBulkCopy(myConnection))
                {
                    try
                    {
                        bulkcopy.DestinationTableName = tbTable.Text;
                        bulkcopy.WriteToServer(dt);
                        lblCSVStatus.Invoke((MethodInvoker)delegate
                        {
                            lblCSVStatus.Text = "Successfully Updated " + tbTable.Text + " Table";
                            lblCSVStatus.ForeColor = System.Drawing.Color.Green;
                        });
                        tbTable.Invoke((MethodInvoker)delegate
                        {
                            tbTable.Enabled = true;
                        });
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message.ToString(),
                                        "Program Error",
                                        MessageBoxButtons.OK,
                                        MessageBoxIcon.Exclamation);
                        lblCSVStatus.Invoke((MethodInvoker)delegate
                        {
                            lblCSVStatus.Text = "Failed to Update " + tbTable.Text + " Table";
                            lblCSVStatus.ForeColor = System.Drawing.Color.Red;
                        });
                        tbTable.Invoke((MethodInvoker)delegate
                        {
                            tbTable.Enabled = true;
                        });
                    }
                }
            } 
         }

         myConnection.Close();

         sr.Close();
    };
    worker.ProgressChanged += (sender, args) =>
    {
        //lblCSVStatus.Text = "Working...";
        pbUpdate.Value = args.ProgressPercentage;
    };

    worker.RunWorkerAsync();
}

我正在使用BackgroundWorker来显示操作的进度。 我正在尝试根据操作将 ProgressBar pbUpdate值从 0 更新到 100。

如何修改代码以实现我想要做的事情?

回答1

打开 StreamReader 后,您可以从中获取长度: sr.Length 。 在每个 ReadLine 之后,您可以使用sr.Position获取当前位置。

通过这两个数据项,您可以知道已处理的百分比。 (但是,它并没有告诉你文件中有多少行,只是告诉你你是 xKb 到总共 yKb。)

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • How to show progress of reading from a file and writing to a database
    I have the following function which is called from a button click. The function reads the file and then attempts to write to a SQL table: public void saveCSV() { lblCSVStatus.Text = ""; worker = new BackgroundWorker { WorkerReportsProgress = true }; worker.DoWork += (sender, args) => { tbTable.Invoke((MethodInvoker)delegate { tbTable.Enabled = false; }); myConnection = new SqlConnection(cString); myConnection.Open(); /* BEGIN READING CSV FILE */ StreamReader sr = new StreamReader(tbCSVFileLocation.Text.ToString()); string line = sr.ReadLine(); string[] value = line.Split(','); DataTable dt =
  • 在进度元素上显示AJAX上传状态(Show AJAX upload status on progress element)
    问题 我有一个AJAX脚本,可将文件上传到PHP脚本,该脚本可能至少需要10秒钟才能运行。 我想为用户显示进度。 在执行类中,我有一个属性$progress ,它会随着进度(在1-100中)而更新,还有一个方法get_progress() (目的应该很明显)。 问题是,如何更新前端的<progress>元素供用户查看? 我认为AJAX是解决方案,但是我无法解决。 我无法到达相同的对象实例。 回答1 如果您的任务是上传大量数据集或在服务器上处理它,则在更新进度到服务器时,您应该考虑采用某种作业架构,在该架构中启动作业并使用在服务器上运行的其他脚本来完成服务器(例如缩放/处理图像等)。 在这种情况下,您一次只能做一件事,因此形成了一个任务管道,其中有一个输入和一个最终的处理后的输出。 在流水线的每个步骤中,任务状态都会在数据库中更新,然后可以通过目前存在的任何服务器推送机制将其发送给用户。 运行用于处理上载和更新的单个脚本会给服务器带来负担,并会限制您的工作(如果浏览器关闭,发生其他错误怎么办)。 将过程划分为多个步骤后,您可以从成功完成的点开始继续执行失败的任务。 有很多方法可以做到这一点。 但是整个流程看起来像这样 以下方法是我为个人项目所做的工作,此脚本非常适合将数千个高分辨率图像上传和处理到我的服务器上,然后将其缩小到多个版本并上传到Amazon s3,同时识别其中的对象。
  • 更新上传过程的进度对话框(Updating the progress dialog on an uploading process)
    问题 我的程序正在从 SD 卡上传视频没有问题,但我正在尝试添加一个进度对话框以显示到目前为止上传的字节数百分比。 我正在使用异步任务。 但是,尽管我能够在屏幕上显示对话框。 对话框没有更新。 上传完成后,它变成 100/100 并消失。 你能帮我更新进度对话框吗? package com.isoft.uploader2; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.net.HttpURLConnection; import java.net.URL; import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.provider.MediaStore; import android.util.Log
  • mysqldump 是否支持进度条?(Does mysqldump support a progress bar?)
    问题 有什么方法可以确定在mysqldump运行时,已完成多少备份或剩余多少? 回答1 是的,2010 年 3 月 27 日提交了一个补丁: 这个新补丁有一个额外的参数 --show-progress-size,默认设置为 10,000。 因此,当使用 --verbose 时,每 10,000 行,您将获得转储的特定表的行数的常规状态输出。 因此,请检查您的版本,根据需要进行更新并享受。 回答2 安装和使用pv (它作为 CentOS 的 yum 包提供) http://www.ivarch.com/programs/pv.shtml PV(“管道查看器”)是一种通过管道监控数据进度的工具。 它可以插入到两个进程之间的任何正常管道中,以直观地指示数据通过的速度、花费的时间、距离完成的程度以及完成之前的估计时间。 假设生成的 dumpfile.sql 文件的预期大小为 100m(100 兆字节), pv的使用如下: mysqldump <parameters> | pv --progress --size 100m > dumpfile.sql 控制台输出将如下所示: [===> ] 20% 查看手册页man pv以获取更多选项。 您可以显示传输速率,或者已经过去了多少时间,或者已经传输了多少字节等等。 如果您不知道转储文件的大小,有一种方法可以从 table_schema 中获取
  • 来自php服务器处理数据库的ajax流进度(streaming progress in ajax from php server processing database)
    问题 我在本网站上查看了 ajax 进度条解决方案,但是我找不到任何可以帮助解决以下问题的内容, 基本上, [browser] ----> makes ajax call to [server running php] 我的 php 代码 <?php //input and process ajax request //[MySQL] processing 5000 rows of a table //after 5000/5000 row, end of ajax call ?> 现在,我需要向用户显示正在处理的行的状态例如Processing::::::::: 2322/5000。 排 处理Mysql的代码是这样的 foreach($result_set as $table_row) { // process each table row } 我如何通过 xmlhttprequest 让客户知道这个进度? 不能使用JQUERY ,只能使用Javascript 尝试实施以下, 服务器不断循环回显进度, <?php //progress while($i < $total_progress) { //php processing if(@ob_get_contents()){ ob_end_flush(); flush(); } echo $i; // progress $i++
  • 【DBCA -SILENT】静默安装之rac数据库安装
    【DBCA -SILENT】静默安装之rac数据库安装 BLOG文档结构图 之前的相关文章连接: DBCA静默方式建库 :http://blog.itpub.net/26736162/viewspace-1448220/【DBCA -SILENT】静默安装如何启用归档模式: http://blog.itpub.net/26736162/viewspace-1585925/ 之前的文章中介绍了单实例的数据库静默安装方式,今天我们来看看rac数据库的静默安装方式。 查看集群环境是否准备好:[root@node2 ~]# crsctl check cluster -all**************************************************************node1:CRS-4537: Cluster Ready Services is onlineCRS-4529: Cluster Synchronization Services is onlineCRS-4533: Event Manager is online**************************************************************node2:CRS-4537: Cluster Ready Services is onlineCRS-4529
  • MySQL 5.7 新备份工具mysqlpump 使用说明 - 运维小结
    之前详细介绍了Mysqldump备份工具使用,下面说下MySQL5.7之后新添加的备份工具mysqlpump。mysqlpump是mysqldump的一个衍生,mysqldump备份功能这里就不多说了,现在看看mysqlpump到底有了哪些提升,详细可以查看官网文档。mysqlpump和mysqldump一样,属于逻辑备份,备份以SQL形式的文本保存。逻辑备份相对物理备份好处是不关心log的大小,直接备份数据即可。Mysqlpump主要特点- 并行备份数据库和数据库中的对象的,加快备份过程。- 更好的控制数据库和数据库对象(表,存储过程,用户帐户)的备份。- 备份用户账号作为帐户管理语句(CREATE USER,GRANT),而不是直接插入到MySQL的系统数据库。- 备份出来直接生成压缩后的备份文件。- 备份进度指示(估计值)。- 重新加载(还原)备份文件,先建表后插入数据最后建立索引,减少了索引维护开销,加快了还原速度。- 备份可以排除或则指定数据库。Mysqlpump缺点 - 只能并行到表级别,如果表特别大,开多线程和单线程是一样的,并行度不如mydumper;- 无法获取当前备份对应的binlog位置;- MySQL5.7.11之前的版本不要使用,并行导出和single-transaction是互斥的;参数说明:Mysqlpump绝大部分参数使用和Mysqldump一致
  • 文件和文件夹操作——文件操作实列
    1、获取文件大小思路:使用File类的Open方法打开指定的文件,然后使用FileStream类的Length属性获取文件的长度。(1)、File类的Open方法:用来打开指定路径上的FileStream,局域读/写访问权限语法格式:public static FileStream Open(string path,FileMode mode)参数说明:path:要打开的文件。 mode :FileMode枚举值之一枚举值说明CreateNew指定操作系统应创建新文件Create指定操作系统应创建新文件,如果文件已经存在,它将被覆盖Open指定操作系统应打开现有的文件OpenOrCreate指定操作系统应打开文件(如果文件存在,否则创建新文件)Truncate指定操作系统打开现有文件。文件一旦打开,就将被截断文为零字节大小Append打开现有文件并查找到文件尾,或创建新文件。(2)、FileStream类的Length属性FileStream类的Length属性用来获取用字节表示的流长度,语法:Public override long Length{get;}注:程序中使用与文件相关的类时,都需要添加System.IO命名空间private void button1_Click(object sender, EventArgs e) { OpenFileDialog
  • Updating the progress dialog on an uploading process
    My program is uploading a video from SD Card without a problem but I am trying to add a progress dialog to show how much bytes uploaded so far in percentage. I am using async task. However, altough I am able to show the dialog on the screen. The dialog is not updating. After the upload finished it turns to 100/100 and it dissappears. Could you please help me how can I update the progress dialog? package com.isoft.uploader2; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.net.HttpURLConnection; import java.net.URL; import android.app.Activity
  • 显示Ajax调用进度的最佳方法是什么?(What is the best way of showing progress on an Ajax call?)
    问题 我有一个Ajax调用,它可以更新数据库中的5,000条记录,因此需要很多时间。 我有一个Ajax“正在加载图像”,它表明正在发生某些事情,但是我正在寻找一种更好的方式来显示“正在更新5000中的50 .....”,“正在更新5000中的200”或类似的东西。 在Ajax / jQuery中不做5000篇不同文章的最佳方法是什么? 回答1 我认为最好的方法是使用Comet。 在Comet样式的应用程序中,服务器实际上可以将数据推送到客户端(而不是客户端一次又一次从服务器请求数据)。 客户端只需连接一次服务器即可。 然后服务器将继续将数据推回客户端。 从维基百科: Comet是一种编程技术,使Web服务器可以将数据发送到客户端,而无需客户端请求数据。 它允许创建事件驱动的Web应用程序,该应用程序托管在浏览器中。 现在,让我们看看Comet的工作原理。 请参阅以下服务器端代码。 这里使用了while循环,您可以改为设置自己的条件。 在while循环中,页面写入日期时间并刷新,然后睡眠1/2秒。 ASP.NET页面的代码隐藏:Service.aspx.cs public static string Delimiter = "|"; protected void Page_Load(object sender, EventArgs e) { Response.Buffer =
  • 两个同时的AJAX请求不会并行运行(Two simultaneous AJAX requests won't run in parallel)
    问题 我同时运行两个AJAX请求时遇到问题。 我有一个将数据导出到XSLX的PHP脚本。 此操作需要很多时间,因此我尝试向用户显示进度。 我正在使用AJAX和数据库方法。 实际上,我非常确定它曾经可以工作,但是我不知道为什么,它不再在任何浏览器中都能工作。 新浏览器有什么变化吗? $(document).ready(function() { $("#progressbar").progressbar(); $.ajax({ type: "POST", url: "{$BASE_URL}/export/project/ajaxExport", data: "type={$type}&progressUid={$progressUid}" // unique ID I'm using to track progress from database }).done(function(data) { $("#progressbar-box").hide(); clearInterval(progressInterval); }); progressInterval = setInterval(function() { $.ajax({ type: "POST", url: "{$BASE_URL}/ajax/progressShow", data: "statusId={
  • 如何在Java控制台(无UI)中显示下载文件的进度百分比?(How to show percentage progress of a downloading file in java console(without UI)?)
    问题 我的Java代码部分如下。 while (status == DOWNLOADING) { /* Size buffer according to how much of the file is left to download. */ byte buffer[]; if (size - downloaded > MAX_BUFFER_SIZE) { buffer = new byte[MAX_BUFFER_SIZE]; } else { buffer = new byte[size - downloaded]; } // Read from server into buffer. int read = stream.read(buffer); if (read == -1){ System.out.println("File was downloaded"); break; } // Write buffer to file. file.write(buffer, 0, read); downloaded += read; } /* Change status to complete if this point was reached because downloading has finished. */ if (status == DOWNLOADING) {
  • Updating progress dialog
    I am trying to make an application that can help me to evaluate the time to download the file from a web resource. I have found 2 samples: Download a file with Android, and showing the progress in a ProgressDialog and http://www.helloandroid.com/tutorials/how-download-fileimage-url-your-device The second example shows a smaller download time, but I cannot understand how to update progress dialog using it. I think something should be done with "while" expression in second case, but I cannot find what. Could someone give me any piece of advice? UPD: 1st code: try { time1 = System
  • 项目进度记录
    第七周爬虫进度记录 前言一、爬虫的优化二、网址去重1.myspider.py(获取txt的网址)2.middlewares.py(进行每次请求的控制)3.pipelines.py(数据储存的控制) 总结 前言 本周对于爬虫的健壮性和爬取的速度进行了优化,以及增加了爬虫的去重功能。 一、爬虫的优化 网页爬虫本来出于对下载的速度过快可能被网站发现而被封锁ip考虑,从而设置了下载延迟2s,但是发现不是所有网站都是这样的反爬机制,所以对部分爬虫不做这样的设置。同时发现部分的网页爬虫也同样需要登录才能够获取到全部内容,所以给部分网页爬虫也增加了登录功能。 同样发现在爬取的过程中时间过长可能会出现浏览器内存不足从而导致网站崩溃的情况出现,一般出现这种情况需要手动刷新,我们采取了相关的设置进行优化,并定期清除浏览器内存: # 让网页不加载图片 chrome_options = webdriver.ChromeOptions() prefs = {"profile.managed_default_content_settings.images": 2} chrome_options.add_experimental_option("prefs", prefs) chrome_options.add_argument('--headless') chrome_options.add_argument
  • How to show percentage progress of a downloading file in java console(without UI)?
    My part of java code is below. while (status == DOWNLOADING) { /* Size buffer according to how much of the file is left to download. */ byte buffer[]; if (size - downloaded > MAX_BUFFER_SIZE) { buffer = new byte[MAX_BUFFER_SIZE]; } else { buffer = new byte[size - downloaded]; } // Read from server into buffer. int read = stream.read(buffer); if (read == -1){ System.out.println("File was downloaded"); break; } // Write buffer to file. file.write(buffer, 0, read); downloaded += read; } /* Change status to complete if this point was reached because downloading has finished. */ if (status ==
  • Firebase 离线存储高级 - 手动同步和进度信息(Firebase Offline Storage Advanced - Manual Sync and Progress Information)
    问题 我有一个应用程序,其中一个主要功能是“离线使用”。 我们在我们的服务器上生成了一个 SQLite 数据库,我们在 API 上提供了可供下载的内容。 每次数据库发生变化时,用户都必须重新下载完整的 SQLite 数据库(目前有 50MB 并且随着时间的推移不断增长)。 我们尝试改进更新方法,用户只需下载差异 SQL 文件,但存在一些问题(性能、数据库损坏等)。 现在 Google 发布了 Firebase,我认为现在是用 Firebase 系统替换 SQLite 系统的好时机。 但我有一些想法: 我可以下载整个 Firebase 数据库以供离线使用吗(不在应用缓存中,在持久存储中)? 我可以跟踪离线同步的进度并为用户提供选择是现在还是稍后同步? 我可以限制同步到 WIFI 吗? 我可以提供捆绑数据库吗 - 安装应用程序后我已经可以离线查询 Firebase 数据了吗? 我想要的是:仅在我的应用程序中使用 Firebase 来同步数据库 - 但要离线执行所有操作。 如果 Firebase 不是为使用它而设计的,那么有什么好的选择? 然后我有另一个关于 Firebase 的主要问题: JSON 存储很棒 - 但是这样我们就不必关心独特的结构,我们必须注意这一点才能插入始终正确的数据集? 回答1 我可以下载整个 Firebase 数据库以供离线使用吗(不在应用缓存中,在持久存储中)?
  • 在文件上传过程中显示进度条(showing a progress bar during file upload)
    问题 我有一个异步任务,应该在文件上传过程中显示进度。 一切正常,只是看起来它完成文件上传的速度非常快,然后它只是坐在那里 100% 等待。 我将其追溯到 URL url = new URL(urlServer); connection = (HttpURLConnection) url.openConnection(); // Allow Inputs & Outputs connection.setDoInput(true); connection.setDoOutput(true); connection.setUseCaches(false); // Enable POST method connection.setRequestMethod("POST"); connection.setRequestProperty("Connection", "Keep-Alive"); connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); outputStream = new DataOutputStream(connection.getOutputStream()); outputStream.writeBytes(twoHyphens +
  • Uploading HTTP progress tracking
    I've got WPF application I'm writing that posts files to one of social networks. Upload itself working just fine, but I'd like to provide some indication of how far along I am with the uploading. I tried a bunch of ways to do this: 1) HttpWebRequest.GetStream method: using ( var FS = File.Open( localFilePath, FileMode.Open, FileAccess.Read, FileShare.Read)) { long len = FS.Length; HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url); request.Method = "POST"; request.ProtocolVersion = HttpVersion.Version11; request.ContentType = "multipart/form-data; boundary=--AaB03x"; //predata
  • 后台工作者是线程吗? (C#)(Is background worker a thread? (C#))
    问题 后台工作者是线程吗? 我应该什么时候使用它? 回答1 是的,它基本上就像一个线程,但具有额外的功能(通知您进度和完成时间的事件)。 当您需要执行一些可能需要一段时间的事情时(例如计算、文件或数据库读取/写入、Web 请求等),您应该使用它,并且您不希望 GUI 在它发生时出现无响应: BackgroundWorker 类允许您在单独的专用线程上运行操作。 下载和数据库事务等耗时操作可能会导致您的用户界面 (UI) 看起来好像在它们运行时已停止响应。 当您需要响应式 UI 并且面临与此类操作相关的长时间延迟时,BackgroundWorker 类提供了一个方便的解决方案。 阅读如何:在后台运行操作以获取介绍。 回答2 一个简单的例子: static void Main(string[] args) { BackgroundWorker worker = new BackgroundWorker(); //DoWork is a delegate, where you can add tasks worker.DoWork += (sender, e) => { //blabla }; worker.DoWork += (sender, e) => { //blabla }; worker.RunWorkerCompleted += (sender, e) => { var
  • Android - 下载文件时显示进度条(Android - Displaying a progress bar while downloading a file)
    问题 我需要帮助。 我一直在寻找几天来试图找到解决我的问题的方法。 我想在 Android 中下载文件时显示进度条。 我找到了足够的下载文件,但一直在努力弄清楚如何显示进度条。 这是我的下载代码: String sURL = getString(R.string.DOWNLOAD_URL) + getString(R.string.DATABASE_FILE_NAME); HttpClient httpclient = new DefaultHttpClient(); HttpGet httpget = new HttpGet(sURL); HttpResponse response = httpclient.execute(httpget); HttpEntity entity = response.getEntity(); Header[] clHeaders = response.getHeaders("Content-Length"); Header header = clHeaders[0]; int totalSize = Integer.parseInt(header.getValue()); int downloadedSize = 0; if (entity != null) { InputStream stream = entity.getContent()