我用C#语言编写了多线程程序。当加载主窗体时,4个线程开始所有线程都与while(true)一起工作--每个线程运行、活动并存在于线程列表中,但在30 ms之后,线程中的一个线程(没有任何错误)从线程列表中消失,甚至不能工作,甚至断点也无法工作。我希望从TCP读取数据,并处理3步,然后保存到数据库中。
while(true)并从while(true)读取数据并添加到块收集bk1 while(true)中,获取来自bk1的数据并处理数据,然后将数据添加到while(true)中的BlockingCollection bk2H 211H 112任务4中d13从bk3中插入数据,然后插入数据库H 214F 215我定义任务:
Task.Factory.StartNew(() => myfunction, CancellationToken.None,
TaskCreationOptions.PreferFairness, TaskScheduler.Default);当单击button1时,所有任务在一段时间后正常启动和工作,task3将状态更改为RanToCompletion,不工作,我没有在代码中使用异步和等待,因为任务是并行的,不需要等待其他任务。
即使TaskCreationOptions设置为LongRunning,My函数也有while(true)和work producer-consumer方法。
请帮我解决问题。
谢谢大家的关注。
发布于 2022-05-16 06:09:02
您的代码从不等待任务结束。改用await和Task.Run:
await Task.Run(()=>myFunction());或
await Task.Run(myFunction);任务不是线程。它们是由线程线程执行的作业。创建线程是一项昂贵的操作。为了避免创建和销毁线程的成本,.NET保留了一个工作线程池。作业以Action或Func委托的形式发布到该ThreadPool中,并由工作线程之一执行。
Task.Run或Task.Factor.StartNew将作业发布到线程池以供执行,并返回一个Task,本质上是一个“承诺”对象。这意味着调用线程不会被阻塞,等待任务完成,并且可以执行其他工作。await使等待该任务完成并返回到调用线程变得容易。任务完成后,可以在await之后用代码继续执行。
在桌面应用程序中,这意味着UI线程不会被阻塞,等待任务完成,并且可以继续处理Windows消息、按钮单击、刷新其窗口等。当任务完成时,将在UI线程上使用await之后的代码继续执行。
async void btn1_Click(object sender,EventArgs args)
{
var customerName=txtCustomer.Text;
var orders=await Task.Run(()=>LoadOrdersFromDbAsync(customerName));
grdOrders.DataSource=orders;
}https://stackoverflow.com/questions/72254662
复制相似问题