首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的线程在一段时间后从线程列表中消失。

我的线程在一段时间后从线程列表中消失。
EN

Stack Overflow用户
提问于 2022-05-16 05:54:51
回答 1查看 104关注 0票数 0

我用C#语言编写了多线程程序。当加载主窗体时,4个线程开始所有线程都与while(true)一起工作--每个线程运行、活动并存在于线程列表中,但在30 ms之后,线程中的一个线程(没有任何错误)从线程列表中消失,甚至不能工作,甚至断点也无法工作。我希望从TCP读取数据,并处理3步,然后保存到数据库中。

  • Task1:拥有while(true)并从while(true)读取数据并添加到块收集bk1
  • 任务2中:在while(true)中,获取来自bk1的数据并处理数据,然后将数据添加到while(true)中的BlockingCollection bk2
  • Task3中,从bk2中获取数据,然后处理bk3 3H 211H 112任务4中d13从bk3中插入数据,然后插入数据库H 214F 215

我定义任务:

代码语言:javascript
复制
Task.Factory.StartNew(() => myfunction, CancellationToken.None,
    TaskCreationOptions.PreferFairness, TaskScheduler.Default);

当单击button1时,所有任务在一段时间后正常启动和工作,task3将状态更改为RanToCompletion,不工作,我没有在代码中使用异步和等待,因为任务是并行的,不需要等待其他任务。

即使TaskCreationOptions设置为LongRunning,My函数也有while(true)和work producer-consumer方法。

请帮我解决问题。

谢谢大家的关注。

EN

回答 1

Stack Overflow用户

发布于 2022-05-16 06:09:02

您的代码从不等待任务结束。改用awaitTask.Run

代码语言:javascript
复制
await Task.Run(()=>myFunction());

代码语言:javascript
复制
await Task.Run(myFunction);

任务不是线程。它们是由线程线程执行的作业。创建线程是一项昂贵的操作。为了避免创建和销毁线程的成本,.NET保留了一个工作线程池。作业以Action或Func委托的形式发布到该ThreadPool中,并由工作线程之一执行。

Task.RunTask.Factor.StartNew将作业发布到线程池以供执行,并返回一个Task,本质上是一个“承诺”对象。这意味着调用线程不会被阻塞,等待任务完成,并且可以执行其他工作。await使等待该任务完成并返回到调用线程变得容易。任务完成后,可以在await之后用代码继续执行。

在桌面应用程序中,这意味着UI线程不会被阻塞,等待任务完成,并且可以继续处理Windows消息、按钮单击、刷新其窗口等。当任务完成时,将在UI线程上使用await之后的代码继续执行。

代码语言:javascript
复制
async void btn1_Click(object sender,EventArgs args)
{
    var customerName=txtCustomer.Text;
    var orders=await Task.Run(()=>LoadOrdersFromDbAsync(customerName));
    grdOrders.DataSource=orders;

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72254662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档