进度栏仅在方法完成并发布独立exe后运行

时间:2018-12-11 17:57:24

标签: c# .net winforms

这是我的职责。进度条仅在方法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中,无需用户安装即可创建独立的可执行文件。我也可以在这里做吗?

2 个答案:

答案 0 :(得分:-1)

如果您的.Net版本支持System.Threading.Tasks,我将重构该方法为异步方法。然后,您可以使用asyncawait关键字来使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); 

它的正上方。