这是我第一次在C#中使用进度条。我的代码正在复制一些文件,我想通过进度条显示进度。
我不喜欢我的代码的一点是,我必须遍历所有文件来设置最大值...后来我再次经历同样的过程来复制文件。
我只是想不出一个方法来确保在酒吧里流利的进步而不这样做。我首先必须知道最大值对吗?或者有什么诀窍吗?
代码如下所示:
>
设置最大值:
private static void setProgressBar(List<Source> sources, List<Destination> destinations)
{
progress.Value = 0;
progress.Maximum = 0;
foreach (var source in sources)
{
progress.Maximum += System.IO.Directory.GetDirectories(source.directory, "*",
SearchOption.AllDirectories).Count() * destinations.Count +
System.IO.Directory.GetFiles(source.directory, "*.*", SearchOption.AllDirectories).Count() *
destinations.Count;
}
复制文件:
public static void CopyData(List<Source> sources, List<Destination> destinations, RichTextBox box, ProgressBar bar)
{
log = box;
progress = bar;
setProgressBar(sources, destinations);
foreach (var source in sources)
{
foreach (var dirPath in System.IO.Directory.GetDirectories(source.directory, "*",
SearchOption.AllDirectories))
{
foreach (var destination in destinations)
{
logger(dirPath);
System.IO.Directory.CreateDirectory(dirPath.Replace(source.directory, destination.directory));
}
}
foreach (var newPath in System.IO.Directory.GetFiles(source.directory, "*.*", SearchOption.AllDirectories))
{
foreach (var destination in destinations)
{
logger(newPath);
File.Copy(newPath, newPath.Replace(source.directory, destination.directory), true);
}
}
}
}
增加进度条:
私有静态无效记录器(字符串输出){log.Text=“Copy:”输出System.Environment.NewLine;log.SelectionStart=log.Text.Length;log.ScrollToCaret();progress.Increment(1);}
所以我运行相同的代码两次...
我在这里看到两个错误:您从未在CopyData方法中设置进度条的值,第二个错误是:您的CopyData方法将导致您的用户界面冻结,直到方法完成(当时进度条将从0跳到100%)。
您可以将CopyData方法放在BackgroundWorker中,调用ReportProgress,并在ReportProgress事件中设置条形图的新值。
下面是一个如何完成的例子。调用工作人员,而不是静态无效Main(...)
,从那里开始您的CopyData方法
static void Main(string[] args)
{
System.ComponentModel.BackgroundWorker worker = new System.ComponentModel.BackgroundWorker();
worker.ProgressChanged += Worker_ProgressChanged;
worker.DoWork += Worker_DoWork;
//Do work
worker.RunWorkerAsync();
}
private static void Worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
//Get Values
var source = null;
var destinations = null;
//CopyData Method
setProgressBar(sources, destinations);
foreach (var source in sources)
{
foreach (var dirPath in System.IO.Directory.GetDirectories(source.directory, "*", SearchOption.AllDirectories))
{
foreach (var destination in destinations)
{
logger(dirPath);
System.IO.Directory.CreateDirectory(dirPath.Replace(source.directory, destination.directory));
//Increase Value by 1
(sender as System.ComponentModel.BackgroundWorker).ReportProgress(1);
}
}
foreach (var newPath in System.IO.Directory.GetFiles(source.directory, "*.*", SearchOption.AllDirectories))
{
foreach (var destination in destinations)
{
logger(newPath);
File.Copy(newPath, newPath.Replace(source.directory, destination.directory), true);
//Increase Value by 1
(sender as System.ComponentModel.BackgroundWorker).ReportProgress(1);
}
}
}
}
private static void Worker_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
if (e.ProgressPercentage == 1)
{
//If Value gets higher than Maximum it will cause an Exception
if (progress.Value < progress.Maximum)
progress.Value += 1;
}
}
private static void setProgressBar(List sources, List destinations)
{
progress.Value = 0;
progress.Maximum = 0;
foreach (var source in sources)
{
foreach (var dirPath in System.IO.Directory.GetDirectories(source.directory, "*", SearchOption.AllDirectories))
{
//Simplified
progress.Maximum += destinations.Count;
}
foreach (var newPath in System.IO.Directory.GetFiles(source.directory, "*.*", SearchOption.AllDirectories))
{
//Simplified
progress.Maximum += destinations.Count;
}
}
}
我正在创建一个JavaFX桌面应用程序,我在上面模拟一些工作负载。我希望应用程序有一个动态更新的进度指示器(随着时间的推移),以显示加载过程是如何进行的。这是我的应用程序类: 这是我的预加载程序类: 另外,我需要说的是,我已经检查了这两个问题(预加载程序中的progressbar不更新和javafx预加载程序不更新进度),但没有找到解决问题的方法。 非常感谢您抽出时间。
问题内容: 我使用Vim已有一段时间了,在PHP文件中无法正常使用HTML缩进。 例如,我想要的是让每个孩子都比其父缩进一个标签,如下所示。 使用PHP-correct- Indent 脚本,代码的格式如下: 即使使用缩进的HTML,然后再向其中添加PHP代码,缩进也会被忽略,从而移动HTML代码的新行而根本没有任何缩进。 那么,有什么方法可以使用Vim获得想要在PHP文件中使用HTML的缩进格式
问题内容: 我试图了解Java 8中API 的方法。 我有简单的逻辑: 但这会导致编译错误: 我当然可以做这样的事情: 但这就像混乱的支票一样。 如果我将代码更改为此: 代码变得越来越脏,这让我想到了回到旧支票。 有任何想法吗? 问题答案: 需要作为参数。您正在向其传递类型为void的表达式。因此,它不会编译。 使用者应被实现为lambda表达式: 甚至更简单,使用方法参考: 这基本上与 想法是仅
问题内容: 我正在尝试了解的语义,以及实体管理器对未保存的瞬态实例的确切含义。我要实现的只是向会话添加一个新的临时实例,并在刷新会话时让Hibernate执行一个。 我发现如果持久保存一个新实例,然后在同一会话中对其进行修改,则实体管理器将同时生成和语句,这可能会导致约束冲突。 例如,假设我有一个带有列 栏 和以下服务方法的实体关系 Foo 。 __ 尽管我们为提供了一个值,但是执行此代码将违反数
问题内容: 什么时候应该从而不是从中导出例外? 不必在方法的子句中声明A ,因为它不一定要专门列出,否则可能是 好 方法,也可能是 不好的, 因为显式声明方法的异常是一种好习惯。 有什么想法吗? 问题答案: 来自未经检查的异常- 争议 : 如果可以合理预期客户端会从异常中恢复,请将其设置为已检查的异常。如果客户端无法采取任何措施来从异常中恢复,请将其设置为未经检查的异常。 请注意,未检查的异常是从
问题内容: 我在AngularJS应用程序中为i18n 使用angular-translate。 对于每个应用程序视图,都有一个专用的控制器。在下面的控制器中,我设置了要显示为页面标题的值。 码 的HTML 的JavaScript 我正在使用angular-translate-loader-url扩展名加载翻译文件。 问题 在初始页面加载时,将显示翻译键,而不是该键的翻译。翻译是,但我看到了。 第