【发布时间】:2016-05-08 08:55:44
【问题描述】:
我想创建一个 BackgroundWorkers 数组,它们彼此协同工作以利用多核处理器。假设我希望其中八个同时工作。我还想要一个单独的 Timer 线程在 GUI 中报告每个线程一直在处理的一些数据。
我的问题是这个。每个工人开始工作大约需要 3-4 秒。所以数组中的第一个工作元素立即开始。第二个在几秒钟后开始。第三个开始几秒钟后等等等等。
我希望他们都立即开始。我该如何解决这个问题?
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
BackgroundWorker[] bw;
int threads = 8;
data[] d;
private void Form1_Load(object sender, EventArgs e)
{
d = new data[threads];
for (int i = 0; i < threads; i++) d[i] = new data(i);
bw = new BackgroundWorker[threads];
for (int i = 0; i < threads; i++)
{
bw[i] = new BackgroundWorker();
bw[i].DoWork += new DoWorkEventHandler(Work);
}
timer1.Enabled = true;
for (int i = 0; i < threads; i++) bw[i].RunWorkerAsync(d[i]);
}
private void Work(object sender, DoWorkEventArgs e)
{
data o = (data)e.Argument;
while (true) o.count += o.id;
}
private void timer1_Tick(object sender, EventArgs e)
{
StringBuilder sb = new StringBuilder();
long total = 0;
for (int n = 0; n < threads; n++) {
sb.Append(d[n].id + ": " + d[n].count + "\n");
total+=d[n].count;
}
sb.Append("TOTAL: "+total);
richTextBox1.Text = sb.ToString();
}
}
public class data {
public int id;
public long count;
public data(int id)
{
this.id = id;
this.count = 0;
}
}
-------------------编辑:发现晚于 3-4 秒的延迟仅适用于您拥有的最大逻辑核心数。因此,如果您有 20 个内核,并设置 20 个线程,那很好。但是,如果您有 4 个内核并设置 20 个线程,则在创建前 4 个之后的 16 个线程之间会有延迟。
【问题讨论】:
标签: c# multithreading parallel-processing backgroundworker