我在我的 .NET 4 应用程序中使用了并行数据结构,并且ConcurrentQueue在我处理它时添加了一个。
我想做类似的事情:
personqueue.AsParallel().WithDegreeOfParallelism(20).ForAll(i => ... );
当我调用数据库来保存数据时,我限制了并发线程的数量。
但是,我希望ForAll不会出队,我担心只是做
ForAll(i => {
personqueue.personqueue.TryDequeue(...);
...
});
Run Code Online (Sandbox Code Playgroud)
因为不能保证我弹出正确的一个。
那么,我如何以并行方式遍历收集和出队。
或者,使用PLINQ并行进行此处理会更好吗?
为什么PLINQ输出与顺序处理和Parallel.For循环不同
我想添加10,000,000个数字的平方根.以下是3个案例的代码:
顺序循环:
double sum = 0.0;
for(int i = 1;i<10000001;i++)
sum += Math.Sqrt(i);
Run Code Online (Sandbox Code Playgroud)
输出为:21081852648.717
现在使用Parallel.For循环:
object locker = new object();
double total ;
Parallel.For(1,10000001,
()=>0.0,
(i,state,local)=> local+Math.Sqrt(i),
(local)=>
{
lock(locker){ total += local; }
}
);
Run Code Online (Sandbox Code Playgroud)
输出为:21081852648.7199
现在使用PLINQ
double tot = ParallelEnumerable.Range(1, 10000000)
.Sum(i => Math.Sqrt(i));
Run Code Online (Sandbox Code Playgroud)
输出为:21081852648.72
为什么PLINQ输出和Parallel.For和Sequential for loop之间有区别?
parallel-processing parallel-extensions plinq task-parallel-library
我有一个二维整数数组。我想编写一个优化且快速的代码来汇总二维数组的所有列。
有什么想法可以使用LINQ / PLINQ / TASK并行化来实现吗?
例如:
private int[,] m_indexes = new int[6,4] { {367, 40, 74, 15},
{535, 226, 74, 15},
{368, 313, 74, 15},
{197, 316, 74, 15},
{27, 226, 74, 15},
{194, 41, 74, 15} };
Run Code Online (Sandbox Code Playgroud) 据我所理解:
利用多核或多处理器的编程称为并行编程.
但是,如果我没有 > 1个核心呢?
命令如下:
"abcdef".AsParallel().Select(c=>char.ToUpper(c)).ToArray()
Run Code Online (Sandbox Code Playgroud)
会按顺序运行吗?
(我知道即使我有> 1个核心,Plinq优化仍然可以选择不并行.但我的问题是关于= = 1个核心.)
要么
它仍然可以在多个线程(1核心)中,如:

(但恕我直言,它不会是并行编程)
我有点困惑.非常感谢帮助.
这段代码有什么区别:
int[] tab = new int[] { 1, 2, 3, 4, 5 };
List<int> result1 = (from t in tab
where t > 2
select t).AsParallel().ToList();
Run Code Online (Sandbox Code Playgroud)
和这个:
List<int> result2 = (from t in tab.AsParallel()
where t > 2
select t).ToList();
Run Code Online (Sandbox Code Playgroud)
?
我正在List<Boss>收藏,每个老板都有2到10个助理人员。我正在将所有员工(包括老板)分组。现在,我正在使用Parallel LINQList<Person>搜索“ Raj”,在Where子句之前或之后,可以在哪里放置支持方法以获得更好的性能?AsParallel()
public class Person
{
public int EmpID { get; set; }
public string Name { get; set; }
public string Department { get; set; }
public string Gender { get; set; }
}
void Main()
{
List<Boss> BossList = new List<Boss>()
{
new Boss()
{
EmpID = 101,
Name = "Harry",
Department = "Development",
Gender = "Male",
Employees = new List<Person>()
{
new Person() {EmpID = 102, Name = …Run Code Online (Sandbox Code Playgroud) 更新2011-05-20 12:49 AM:foreach仍然比我的应用程序的并行解决方案快25%.并且不要使用最大并行度的集合计数,使用更接近机器核心数量的东西.
=
我有一个IO绑定任务,我想并行运行.我想对文件夹中的每个文件应用相同的操作.在内部,该操作导致Dispatcher.Invoke将计算的文件信息添加到UI线程上的集合.因此,从某种意义上说,工作结果是方法调用的副作用,而不是直接从方法调用返回的值.
这是我想要并行运行的核心循环
foreach (ShellObject sf in sfcoll)
ProcessShellObject(sf, curExeName);
Run Code Online (Sandbox Code Playgroud)
这个循环的上下文在这里:
var curExeName = Path.GetFileName(Assembly.GetEntryAssembly().Location);
using (ShellFileSystemFolder sfcoll = ShellFileSystemFolder.FromFolderPath(_rootPath))
{
//This works, but is not parallel.
foreach (ShellObject sf in sfcoll)
ProcessShellObject(sf, curExeName);
//This doesn't work.
//My attempt at PLINQ. This code never calls method ProcessShellObject.
var query = from sf in sfcoll.AsParallel().WithDegreeOfParallelism(sfcoll.Count())
let p = ProcessShellObject(sf, curExeName)
select p;
}
private String ProcessShellObject(ShellObject sf, string curExeName)
{
String unusedReturnValueName = sf.ParsingName
try
{
DesktopItem di …Run Code Online (Sandbox Code Playgroud) 我有这种情况:
var tasks = new List<ITask> ...
Parallel.ForEach(tasks, currentTask => currentTask.Execute() );
Run Code Online (Sandbox Code Playgroud)
是否有可能指示PLinq在下一个线程产生之前等待500ms?
System.Threading.Thread.Sleep(5000);
Run Code Online (Sandbox Code Playgroud) 我有一个任务是使用PLINQ并行化迭代.为此,我有一个基于for-cycle的功能:
public void PointGenerator(int n, Random rnd)
{
for (int i = 1; i <= n; i++)
{
x = rnd.NextDouble();
y = rnd.NextDouble(); //
if (((x - 0.5) * (x - 0.5) + (y - 0.5) * (y - 0.5)) < 0.25)
{
N_0++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么能用PLINQ呢?
我对使用并发性有一些疑问LINQ AsParallel().
假设我有以下代码:
int counter = 0;
someList.AsParallel().ForEach(item => {
doStuff();
counter++;
});
Run Code Online (Sandbox Code Playgroud)
我没有找到太多在线...
做这样的事情是否安全?有没有更好的方法呢?
我应该做一些锁定动作counter吗?
提前致谢