gpt4 book ai didi

c# Task.WhenAll 在等待完成时阻塞

转载 作者:行者123 更新时间:2023-12-03 12:51:44 33 4
gpt4 key购买 nike

我有一个简单的 Winforms 应用程序。我想后台 TCP 连接/打印请求,并在我的代码中的设定点检查所有任务的输出。

我希望 ReportOnTasks阻止直到 WaitAll完成了。请有人能解释为什么不是这样吗?我也担心我的结构不正确。

编辑,以澄清我的意图:
我想在收到数据后立即发送打印作业。然后继续进行其他一些数据库操作。完成所有打印操作后,我想更新 UI 以说明结果。

我试图尽可能地简化代码。也许太多了。 HomeController 只是初始化一些东西。表单和文件观察器上有触发主要功能的按钮。

public class HomeController 
{

public HomeController(){

MessageBox.Show("1");

oPrintController.PrintAsync("192.168.2.213", Encoding.ASCII.GetBytes("string to print"));

MessageBox.Show("2");

// Block here untill tasks are complete
ReportOnTasks();

MessageBox.Show("Report on tasks complete");
}


public async void ReportOnTasks()
{
await Task.WhenAll(oPrintController.Tasks);

foreach(Task<PrintController.PrintResult> PR in oPrintController.Tasks)
{
// do something with the result of task
}
}
}

PrintController
public class PrintController
{

public List<Task<PrintResult>> Tasks = new List<Task<PrintResult>>();


public async void PrintAsync(string sIP, List<byte[]> lsToPrint, int iPort = 9100)
{
var s = await Task.Run(() => PrintAsync1(sIP, lsToPrint));
}

public async System.Threading.Tasks.Task<PrintResult> PrintAsync1(string sIP, List<byte[]> lsToPrint, int iPort = 9100)
{

using (TcpClient tc = new TcpClient())
{
await tc.ConnectAsync(sIP, iPort);
using (var ns = tc.GetStream())
{
foreach (byte[] btLabel in lsToPrint)
{
await ns.WriteAsync(btLabel, 0, btLabel.Length);
}
}
}

Thread.Sleep(10000);

return new PrintResult();
}
}

public class PrintResult
{
bool bSuccess = false;
}

最佳答案

你不是 await调用ReportOnTasks()而且,你不能await在 ctor 中,因为它们不能是异步的。

取决于您的 HomeController使用时,您可以使用返回 HomeController 实例的静态异步方法,而是由私有(private) ctor 创建:

像这样的东西:

public class HomeController 
{

//notice private - you can't new up a HomeController - you have to use `CreateInstance`
private HomeController(){

MessageBox.Show("1");

//not clear from your code where oPrintController comes from??
oPrintController.PrintAsync("192.168.2.213", Encoding.ASCII.GetBytes("string to print"));

MessageBox.Show("2");

MessageBox.Show("Report on tasks complete");
}

public static async Task<HomeController> CreateInstance() {
var homeController = new HomeController();

await homeController.ReportOnTasks();

return homeController;
}


//don't use async void! Change to Task
public async Task ReportOnTasks()
{
//not clear from your code where oPrintController comes from??
await Task.WhenAll(oPrintController.Tasks);

foreach(Task<PrintController.PrintResult> PR in oPrintController.Tasks)
{
// do something with the result of task
}
}
}

用法:
var homeControllerInstance = await HomeController.CreateInstance();

关于c# Task.WhenAll 在等待完成时阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56356264/

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