相关疑难解决方法(0)

并行地以顺序方式执行N个线程

我有一个应用程序,我有1个大文件的1000多个小部分.

我必须一次最多上传16个零件.

我使用.Net的Thread并行库.

我使用Parallel.For来划分多个部分并分配1个应该为每个部分执行的方法,并将DegreeOfParallelism设置为16.

我需要使用由不同部件上传生成的校验和值来执行1方法,因此我必须设置某些机制,我必须等待所有部件上传说1000完成.在TPL库中,我面临的问题是它是从1000中随机执行16个线程中的任何一个.

我想要一些机制,我可以在最初运行前16个线程,如果第一个或第二个或任何16个线程完成其任务,则应该启动第17个部分.

我怎样才能实现这一目标?

在此输入图像描述

c# multithreading task-parallel-library c#-4.0 parallel.foreach

9
推荐指数
2
解决办法
3326
查看次数

考虑到使用Task.Run异步运行任何方法的能力,.Net Framework中的*Async方法的目的是什么?

简短的问题:

为什么.Net Framework添加了很多*Async版本的方法而不是开发人员只是Task.Run用来异步运行同步方法?

详细问题:

  • 我理解异步性的概念.
  • 我知道 Tasks
  • 我知道async/await关键字.
  • 我知道.Net Framework中的*Async方法有什么用.

我不明白的是库中*Async方法的目的.

假设您有两行代码:

F1();
F2();
Run Code Online (Sandbox Code Playgroud)

关于数据/控制流程,只有两种情况:

  • F2需要在F1完成后执行.
  • F2不需要等待F1完成.

我没有看到任何其他情况.我没有看到任何一般需要知道执行某些功能的具体线程(除了UI).线程中代码的基本执行模式是同步的.并行性需要多个线程.异步性基于并行性和代码重新排序.但基地仍然是同步的.

F1工作量很小时,差异无关紧要.但是当A花费大量时间完成时,我们可能需要查看情况,如果F2不需要等待F1完成,我们可以F1并行运行F2.

很久以前我们使用线程/线程池来做到这一点.现在我们有Tasks.

如果我们要运行F1F2在同时,我们可以这样写:

var task1 = Task.Run(F1);
F2();
Run Code Online (Sandbox Code Playgroud)

任务很酷,我们可以await在最终需要完成任务的地方使用.

到目前为止,我认为没有必要制作F1Async()方法.

现在,我们来看一些特殊情况.我看到的唯一真正特殊情况是UI.UI线程是特殊的并且停止它会使UI冻结很糟糕.正如我所看到的,Microsoft建议我们标记UI事件处理程序async.标记方法async意味着我们可以使用await关键字基本上在另一个线程上安排繁重的处理并释放UI线程,直到处理完成.

我不能再得到的是为什么我们需要任何*Async方法来等待它们.我们总是可以写await Task.Run(F1);.我们为什么需要F1Async

你可能会说*Async方法使用一些特殊的魔法(比如处理外部信号),使它们比同步方法更有效.事情是,我不认为这是事实.

我们来看看Stream.ReadAsync例如.如果你看一下源代码,ReadAsync就浪费几百行铃声和口哨代码来创建一个只调用同步Read方法的任务.那为什么我们需要呢?为什么不直接使用Task.RunStream.Read …

.net c# multithreading asynchronous async-await

4
推荐指数
2
解决办法
1099
查看次数