【问题标题】:Issues with Button not changing when using Process.Start() in Blazor在 Blazor 中使用 Process.Start() 时按钮未更改的问题
【发布时间】:2021-06-08 14:09:46
【问题描述】:

我遇到了一个问题,我想在运行 Process.Start() 时更改按钮文本。 这是我所拥有的:

<button class="btn-lg btn- @ButtonClass" disabled="@IsDisabled" @onclick="GenerateReports"><i class="@ButtonIcon"></i> @Button</button>

public partial class Index
    {
        private string Button { get; set; }
        private string ButtonClass { get; set; }
        private string ButtonIcon { get; set; }
        private bool IsDisabled { get; set; }

        protected override void OnInitialized()
        {
            Button = "Generate Reports";
            ButtonClass = "btn-primary";
            ButtonIcon = "fas fa-copy";
            IsDisabled = false;
        }

        private Task GenerateReports()
        {
            try
            {
                Button = "Please Wait. Reports Being Generated.";
                ButtonClass = "btn-secondary";
                ButtonIcon = "fas fa-spinner";
                IsDisabled = true;

                Process process = new Process();
                process.StartInfo.FileName = @"\\MyServer\E$\ObjectCode\Test.bat";
                process.StartInfo.RedirectStandardOutput = false;
                process.StartInfo.RedirectStandardError = false;
                process.StartInfo.UseShellExecute = false;
                process.Start();
                process.WaitForExit();

                Button = "Reports Generated!";
                ButtonClass = "btn-success";
                ButtonIcon = "fas fa-check";

                return Task.FromResult(true);
            }
            catch (Exception)
            {
                throw;
            }
        }

基本上,我要做的是在禁用按钮的同时更改按钮文本。如果我将 Process 部分注释掉,它可以正常工作。但是,一旦我运行进程,它不会更改按钮也不会禁用它。 为了完成这项工作,我还需要做些什么吗? 提前致谢!

【问题讨论】:

  • 我总是尝试看看是否致电StateHasChanged 有帮助。尝试在您返回之前立即调用它。
  • @HansKilian,我试过了。它不起作用。谢谢!

标签: c# process blazor-server-side process.start


【解决方案1】:

这是由于按钮被禁用并且文本正在更改,但在 GenerateReports() 退出之前 UI 未更新

您可以将此函数拆分为两个单独的函数,一个将被调用以启动进程(并将其存储在私有值中),第二个将在进程完成后调用。

对于第二部分,您可以使用此处描述的方法: How to get notification that a System.Threading.Tasks.Task has completed

【讨论】:

  • 感谢您的回答。我确实尝试拆分甚至使用 StateHasChanged。但是,这也不起作用。至于正在完成的过程,这就是 WaitForExit 的用途。它基本上停止其他一切,直到工作完成。该部分工作正常,因为它确实更改了按钮以显示正确的消息。
  • JTO,按照你的思路,我其实是在玩它,并且能够弄清楚这件事。我最终不得不放置一个 Task.Delay 然后调用 split 函数,如下所示: private async Task ChangeButtons() { Button = "Please Wait. Reports Being Generated."; ButtonClass = "btn-secondary"; ButtonIcon = "fas fa-spinner"; IsDisabled = true; StateHasChanged();等待任务。延迟(3000);等待生成报告();它就像一个魅力。谢谢!
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 2021-10-06
  • 1970-01-01
相关资源
最近更新 更多