【问题标题】:Updating GUI Label as a new thread's deletage将 GUI 标签更新为新的线程委托
【发布时间】:2014-08-13 14:52:24
【问题描述】:

当使用委托函数作为新线程时,如何更新 GUI?我正在尝试更新一个标签,它会告诉用户应用程序的进度状态,但这样一来,它只会在完成后更新,而不是在执行时更新。

public partial class Form1 : Form
{
        private void button1_Click_1(object sender, EventArgs e)
        {
            new Thread(new ThreadStart(delegate()
            {
                int currentFile= 0;
                int allFiles = Source.FilePaths.Count;
                foreach (var path in Source.FilePaths)
                {
                    var file = new File(path, Source.DestDirPath, System.IO.File.ReadAllLines(path));

                    file.saveSQL();

                    currentFile++;

                    int rounded = (int)((currentFile/ allFiles) * 100);

                    CompletionLabel.Invoke(new MethodInvoker(() => Completion.Text = "Completion: " + rounded + "%"));

                }
            })).Start();
        }
}

我想让它尽可能简单,因为它只是一个简单的转换器,可以将一些文本文件转换为 sql 文件。

【问题讨论】:

  • int rounded = (int)(((double)currentFile/ allFiles) * 100); ?
  • 27/35 = 0,77..., *100 = 77 当你四舍五入时,进度百分比
  • 问题是什么?你总是看到0 %
  • 当我激活进程时,我看到 0%,在它完成 100% 之后。我认为它只更新一次。

标签: c# multithreading user-interface


【解决方案1】:

不,你的问题是整数除法。要修复它,您只需要转换为doublefloat。如果您注意到我的第一条评论,您就会得到答案。

int rounded = (int)(((double)currentFile/ allFiles) * 100);

当你将两个整数相除时,结果总是一个整数。为了 例如,7 / 3 的结果是 2。要确定 7 / 的余数 3、使用余数运算符(%)。获得商作为有理数 数字或分数,给出被除数或除数类型 float 或 type 双倍的。如果您表示除数,则可以隐式分配类型 或除数作为小数通过将数字放在右侧 小数点,如下例所示

From msdn

【讨论】:

  • 当您评论答案时,我在在线c#编译器中尝试过,但我认为我也使用了(双)转换,所以我复制了您的版本。 :) 还是谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多