首页 文章

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

提问于
浏览
-1

这是我的功能 . 进度条仅在方法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#应用程序而无需用户安装它?我找到了一个似乎在调试/发布文件夹中运行良好的exe,但是我真的需要所有文件吗?在Java中,我能够创建独立的可执行文件而无需用户安装它 . 我也可以在这里做吗?

2 回答

  • -2

    如果您的.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

    如果你试图让它一步一步,确保将其步数设置为100.然后如果它正在处理数据,则采用正在处理的记录数并除以100.现在每次程序迭代超过1 / 100记录电话

    progressBar1.Invoke(new MethodInvoker(delegate{ progressBar1.PerformStep(); }));
    

    并确保它有时间更新没有线程锁定的地方

    Thread.Sleep(10);
    

    在它上面 .

相关问题