这是我的职责。进度条仅在方法readFile.Read运行后运行。没关系,但这意味着当readFile.Read运行时,我的应用程序看起来像是被冻结了。有什么方法可以让它在我的方法运行时运行吗?我无法像进度条已完成但任务尚未完成那样放置它,用户可能会关闭应用程序。
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
var backgroundWorker = sender as BackgroundWorker;
backgroundWorker.WorkerReportsProgress = true;
var counter = FileCount / 100;
var files = System.IO.Directory.GetFiles(Input);
FileCount = files.Count();
for (int i = 0; i < FileCount; i++)
{
readFile.Read(files[i], Dictionary, Output);
backgroundWorker.ReportProgress(((i+1)*100)/FileCount);
}
}
private void backgroundWorker_ProgressChanged(object sender,
ProgressChangedEventArgs e)
{
// Change the value of the ProgressBar to the BackgroundWorker progress.
ProgressBar.Value = e.ProgressPercentage;
}
此外,是否有一种无需用户安装即可发布我的c#应用程序的方法?我在debug / release文件夹中找到了一个看起来运行良好的exe,但是我真的需要所有文件吗?在Java中,无需用户安装即可创建独立的可执行文件。我也可以在这里做吗?
答案 0 :(得分:-1)
如果您的.Net版本支持System.Threading.Tasks
,我将重构该方法为异步方法。然后,您可以使用async
和await
关键字来使UI保持响应,并以与程序同步时相同的方式更新ProgressBar
。这样的事情应该起作用:
private async Task DoWorkAsync(string InputDirectory)
{
var files = System.IO.Directory.GetFiles(InputDirectory);
for (int i = 0; i < files.Length; i++)
{
await Task.Run(() => readFile.Read(files[i], Dictionary, Output));
ProgressBar.Value = ((i + 1) * 100) / files.Length;
}
}
关于部署应用程序,不,您不必使用安装程序。您确实需要将所有.exe
文件和相关的.dll
文件复制到每个客户端工作站。您还必须注意,您的客户端可能未安装正确版本的.Net。使用安装程序可以大大简化此过程。
答案 1 :(得分:-2)
如果您尝试一次使它前进1步,请确保将其步数设置为100。 如果正在处理数据,则将要处理的记录数除以100。现在,每次程序迭代记录的1/100时调用
progressBar1.Invoke(new MethodInvoker(delegate{ progressBar1.PerformStep(); }));
并确保有时间在没有线程锁定位置的情况下进行更新
Thread.Sleep(10);
它的正上方。