c# - 异步仍然卡住 ui

标签 c# asynchronous async-await

我从来没有完全理解异步编程。 我有这个方法:

internal static Task gpUpdate(string pcName, string localUser, string localPass)
        {
            return Task.Run(() =>
            {
                string result = "";
                string command = @"/C psexec \\" + pcName + " /accepteula -s Gpupdate.exe /force";
                // string command = "/C winrs -r:" + pcName + " ECHO ON&echo N|Gpupdate.exe /force";
                Process process = new Process();
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.StandardOutputEncoding = Encoding.GetEncoding(CultureInfo.CurrentCulture.TextInfo.OEMCodePage);
                process.StartInfo.RedirectStandardOutput = true;
                process.StartInfo.FileName = "CMD.exe";
                process.StartInfo.WorkingDirectory = @"C:\Windows\System32";
                process.StartInfo.Arguments = command;
                process.StartInfo.UserName = Credentials.username;
                process.StartInfo.Password = Credentials.securePassword;
                process.StartInfo.Domain = "EPCE001N";
                process.Start();

                var output = process.StandardOutput.ReadToEnd();

                if (output.Contains("Aktualizace zásady uživatele byla úspěšně dokončena."))
                {
                    result = result + Environment.NewLine + pcName + " user GP update success...";
                }
                else
                {
                    result = result + Environment.NewLine + pcName + " user GP update failed...";
                }

                if (output.Contains("Aktualizace zásady počítače byla úspěšně dokončena."))
                {
                    result = result + Environment.NewLine + pcName + " computer GP update success...";
                }
                else
                {
                    result = result + Environment.NewLine + pcName + " computer GP update failed...";
                }

                PSEXEC.output = PSEXEC.output + Environment.NewLine + result;
            });
        }

我这样调用它:

private async void gpUpdateBtn_Click(object sender, RoutedEventArgs e)
        {
            List<Task> tasks = new List<Task>();
            foreach (var pc in pcNamesListBox.Items)
            {
                tasks.Add(PSEXEC.gpUpdate(pc.ToString(), lclUsernameTxtBox.Text, lclPasswordTxtBox.Password));
            }

            Task.WaitAll(tasks.ToArray());
            textBlock.Text = PSEXEC.output;
        }

但 UI 仍然卡住,我在过去的 2.5 小时内无法完成这项工作。有人可以调查一下吗?

最佳答案

您应该使用 await Task.WhenAll 而不是 Task.WaitAll

关于c# - 异步仍然卡住 ui,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52513470/

相关文章:

c# - Linq OrderBy 特定值不在分组内排序

javascript - 为什么 Promise.all 不异步运行 2 个函数?

javascript - 如果由 window.onbeforeunload 触发,异步 ajax 查询会完成吗?

c# - 在直接从调用另一个库返回任务的库中使用 ConfigureAwait(false) 是否有利?

Dart/flutter : async behaviour of an Isolate's top level function

c# - 无法将 '&' 运算符应用于通用枚举参数

c# - 在 C# 中使用 GetType/instanceof 与替代方案

c# - 如何在 C# Unity 中使用带有二维数组的 C 结构

javascript - 如何在不返回 Promise 的情况下从对象的 `get()` 获取异步数据

c# - 返回结果后,控制流如何保留在异步方法范围内?这类似于变量的闭包吗?