多线程求助

rarewoo 2018-11-07 10:36:17
问:程序有目前有两个线程,UI和检查线程,检查线程中有for循环执行八次相同的过程,每个过程需要处理图片和数据,图片和数据需要并行处理以节省时间,只有图片和数据处理完之后才能继续下一个循环。现在想法是在每次for循环中开两个子线程分别处理图像和数据,但更具体的实现方式不太清楚,能否指点一下?另子线程如何解决超时的问题?子线程等待的时候是否会对UI有影响?
...全文
324 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
超级大咸鱼 2018-12-23
  • 打赏
  • 举报
回复
 private async void Check()
{
List<Task> data = new List<Task>();

for (int i = 0; i < 8; i++)
{
data.Add(Task.Run(() =>
{
#region 处理图像

#endregion
}));


data.Add(Task.Run(() =>
{
#region 处理数据

#endregion
}));
}

Task.WaitAll(data.ToArray());
}
超级大咸鱼 2018-12-23
  • 打赏
  • 举报
回复
 private async void Check()
{
List<Task> data = new List<Task>();

for (int i = 0; i < 8; i++)
{
data.Add(Task.Run(() =>
{
#region 处理图像

#endregion
}));


data.Add(Task.Run(() =>
{
#region 处理数据

#endregion
}));
}

foreach (var item in data)
{
await item;
}
}
anonyomusx 2018-12-05
  • 打赏
  • 举报
回复
试试这样,一个处理图片,一个处理音乐 for() { thread t1 = new thread(); thread t2 = new thread(); }
  • 打赏
  • 举报
回复
在现行的 Task 编程风格中,实际上写
await Task.WaitAll(tasks);
这类代码来“等待”任务全都完成之后,回调这个 await 左边(下边)的汇合点继续执行。这里并不阻塞。 所以 PLinq 那么高大上的好东西,因为有阻塞机制,跟 Task 框架相比显得有点低端了。
  • 打赏
  • 举报
回复
引用 3 楼 娃都会打酱油了 的回复:
Parallel可以用于并发处理,只有所有都结束了才会进入下一步
是的。阻塞程序中,只有 PLinq 这类代码看上去还简单直观一些。
  • 打赏
  • 举报
回复
从设计上说,异步的事务应该异步编程。比如说写
await task1.RunSomething();
这是一个异步回调过程,或者说是一个(某某事情做完了)事件驱动后续任务的设计,并不是什么”死循环+阻塞“设计。 但是有一些初学者,只会用”线程+死循环+阻塞“的来模拟的事件回调或者异步,看起来逻辑简单粗暴,而一旦写代码和调试就发现是极其复杂和混乱的了,大量代码都在那里纠结什么信号锁之类的机制。 实际上从一开始,就应该学会异步Task设计。
  • 打赏
  • 举报
回复
Parallel可以用于并发处理,只有所有都结束了才会进入下一步
  • 打赏
  • 举报
回复
mark下,極有可能這兩天就需要用到
IgoAheadNow 2018-11-30
  • 打赏
  • 举报
回复
可以使用AutoSetEvent 一类的事件用于多线程的同步及等待超时问题。

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧