gpt4 book ai didi

c# - Task.Run( asnyc () => ) 阻塞/不运行所有任务 C#

转载 作者:太空宇宙 更新时间:2023-11-03 19:41:23 34 4
gpt4 key购买 nike

问题是我尝试多次运行 RunPrivateMethod(),但我遇到了阻塞问题,或者在我使用 async/await 时直接无法正常工作。与其在这里分享每一次尝试,我只是把我当前的版本。

在 RunPrivateMethod() 中,exeProcess.WaitForExit() 方法是一个外部程序,基本上读取/写入/运算/输出数据。我试图将其作为异步任务运行,但没有成功。

我不知道这是否合理,但我想限制一次启动的任务数量,所以我在每个 case block 的末尾添加了 Task.WaitAll() 。情况 (1) 和情况 (2) 始终都会运行。

所以,这是我的代码。目前,它会在加载每个任务时阻塞。然后似乎只有最后一个任务在运行。如果我取出所有 Task 语句并正常运行一切,它会正常工作。

我真的很感激任何意见或帮助。我的大部分测试最终都会锁定我的系统和键盘。

public void RunSomeTasks(int group)
{

switch (group)
{

case (1):
{
Task.Run(async () => await RunAsyncMethod(param1, param1, group));
Task.Run(async () => await RunAsyncMethod(param1, param2, group));
Task.Run(async () => await RunAsyncMethod(param1, param3, group));
Task.WaitAll();
break;
}
case (2):
{
Task.Run(async () => await RunAsyncMethod(param2, param1, group));
Task.Run(async () => await RunAsyncMethod(param2, param2, group));
Task.Run(async () => await RunAsyncMethod(param2, param3, group));
Task.WaitAll();
break;
}
}
}

async Task RunAsyncMethod(string var1, string var2, string varGroup)
{

////////////////////////////////////////////
// Use ProcessStartInfo class
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
startInfo.FileName = "SomeOutsideEXE";
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = var1 + " " + var2 + " " + varGroup;
using (Process exeProcess = Process.Start(startInfo))
{
// did not work -> Task.Run(() => exeProcess.WaitForExit()).Wait();
exeProcess.WaitForExit();
}
}
}

我为此工作了无数个小时并阅读了 Cleary 的书,最新修订版是这篇文章的一个版本:Aync/Await action within Task.Run()当前的结果是,尽管 exeProcess 的启动时间正确,但每组中的最后一个任务仍然有效。我无法在它运行时使用键盘。

我确实尝试了 RunSomeTasks() 的直接异步方法,然后只是先等待 RunAsyncMethod。我真的需要一些帮助,是的,我已经知道尽管经过长时间的阅读和反复试验,我也不知道自己到底在做什么。

最佳答案

我稍微修改了您的示例,这应该可以防止 UI 锁定。请注意,我将 async 添加到按钮点击中。还使用 WhenAll 并传入启动的任务,而不是使用 WaitAll。 (针对完全异步模式进行了更新)

    private async void button1_Click(object sender, EventArgs e)
{
try
{
await RunSomeTasks(1);
await RunSomeTasks(2);
lblStatus.Text = "done!";
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}

public async Task RunSomeTasks(int group)
{
switch (group)
{
case (1):
{
var t1 = RunMethodAsync(param1, param1, group);
var t2 = RunMethodAsync(param1, param2, group);
var t3 = RunMethodAsync(param1, param3, group);
await Task.WhenAll(t1, t2, t3).ConfigureAwait(false);
break;
}
case (2):
{
var t1 = RunMethodAsync(param2, param1, group);
var t2 = RunMethodAsync(param2, param2, group);
var t3 = RunMethodAsync(param2, param3, group);
await Task.WhenAll(t1, t2, t3).ConfigureAwait(false);
break;
}
}
}

async Task RunMethodAsync(string var1, string var2, int varGroup)
{
////////////////////////////////////////////
// Use ProcessStartInfo class
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
startInfo.FileName = "SomeOutsideEXE";
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = var1 + " " + var2 + " " + varGroup;

using (Process exeProcess = new Process())
{
var cts = new TaskCompletionSource<int>();

exeProcess.StartInfo = startInfo;
exeProcess.EnableRaisingEvents = true;

exeProcess.Exited += (sender, e) =>
{
try
{
cts.SetResult(exeProcess.ExitCode);
}
catch (Exception ex)
{
cts.SetException(ex);
}
};

exeProcess.Start();

await cts.Task.ConfigureAwait(false);
}
}

关于c# - Task.Run( asnyc () => ) 阻塞/不运行所有任务 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52771717/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com