提问人:SAILENDRA SUDA 提问时间:2/29/2016 最后编辑:Cody Gray - on strikeSAILENDRA SUDA 更新时间:3/3/2016 访问量:1906
在 .NET 2.0 中使用多个线程并行处理记录
Processing records in parallel in .NET 2.0 using multiple threads
问:
我需要使用多线程并行处理表中可用的记录。我正在使用 C# 并以 .NET 2.0 为目标。
我知道我可以在 .NET 4.0 中执行此操作,但我不确定如何使用 .NET 2.0 实现它。Parallel.ForEach
答:
0赞
Codor
2/29/2016
#1
无需任何其他要求,可以通过定义函数来实现多线程
static void Function()
{
// do some work here
}
然后将其用作不同线程的入口点
Thread iThread = new Thread(Function);
和
iThread.Start();
是启动另一个线程的非阻塞调用。
评论
0赞
SAILENDRA SUDA
2/29/2016
@codor- 如果我想用参数调用函数怎么办?
0赞
Codor
2/29/2016
根据我的理解,将参数作为 agrument 传递是不可能的;您必须使用静态字段来传递和返回信息。
0赞
Valentin
2/29/2016
#2
您需要使用 ThreadPool 和 ManualResetEvent 实现自己的实现。Parallel.Foreach
public class Parallel
{
public static void ForEach<T>(IEnumerable<T> items, Action<T> action)
{
var resetEvents = new List<ManualResetEvent>();
foreach (var item in items)
{
var evt = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem((i) =>
{
action((T)i);
evt.Set();
}, item);
resetEvents.Add(evt);
}
foreach (var re in resetEvents)
re.WaitOne();
}
}
评论
0赞
Sriram Sakthivel
2/29/2016
使用而不是循环以避免不必要的唤醒。WaitHandle.WaitAll
WaitOne
0赞
Sriram Sakthivel
2/29/2016
#3
在 .Net 4.0 之前,除非有特殊用例,否则实现并行性的推荐方法是“ThreadPool”。
例如,如果需要“前台线程”或 STA 线程,则直接使用 Thread 类。否则,答案始终是 ThreadPool。
通过调用 ThreadPool.QueueUserWorkItem 方法使用 ThreadPool。
但是,不提供任何等待完成的方法。如果你想等待完成,你可以使用 Delegate.BeginInvoke,它返回一个(大致相当于 .Net 4.0 之前的 Task),它允许你等待完成等等。QueueUserWorkItem
IAsyncResult
0赞
Ed Power
3/3/2016
#4
这是我回答前面一个问题的示例,它显示了如何启动线程并管理一次运行的线程数。这应该给你一个框架。
下一个:无法加载类型...因为父级不存在
评论
System.Threading