Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多线程填充数组_C#_Arrays_Multithreading_.net 2.0 - Fatal编程技术网

C# 多线程填充数组

C# 多线程填充数组,c#,arrays,multithreading,.net-2.0,C#,Arrays,Multithreading,.net 2.0,在C#Net 2.0上 代码的工作速度比单线程版本稍慢。xDiff=2100,yDiff=2000;单线程几乎14秒,多线程大约16秒(此代码)。一定是出了什么事。 我需要填充结果数组。只有一次在数组的节点上写入数据,并没有读取,所以它应该适合多线程 double[,] result = new double[xDiff, yDiff]; int threadCount = Environment.ProcessorCount; ManualResetEvent finished = new M

在C#Net 2.0上

代码的工作速度比单线程版本稍慢。xDiff=2100,yDiff=2000;单线程几乎14秒,多线程大约16秒(此代码)。一定是出了什么事。 我需要填充结果数组。只有一次在数组的节点上写入数据,并没有读取,所以它应该适合多线程

double[,] result = new double[xDiff, yDiff];
int threadCount = Environment.ProcessorCount;
ManualResetEvent finished = new ManualResetEvent(false);
int perthread = xDiff / threadCount;
int left = xDiff % threadCount;
int toProcess = threadCount;
int s = 0;
int e = left;
for (int ii = 0; ii < threadCount; ii++)
{
  ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object state)
    {
      for (int x = s; x < e; x++)
        for (int y = 0; y < yDiff; y++)
        {
          result[x, y] = DoWork((xStart + x), (yStart + y), p)
        }
      if (System.Threading.Interlocked.Decrement(ref toProcess) == 0) finished.Set();
    }), null);
  s = e;
  e += perthread;
}
finished.WaitOne();
return result;
double[,]结果=新的双精度[xDiff,yDiff];
int threadCount=Environment.ProcessorCount;
ManualResetEvent finished=新的ManualResetEvent(错误);
int perthread=xDiff/threadCount;
int left=xDiff%threadCount;
int toProcess=线程数;
int s=0;
int e=左;
用于(int ii=0;ii
xStart,yStart是double,p是一个大类。DoWork函数只调用p的一些函数,但不在类上写入/更改任何数据

简单结果[x,y]=DoWork((xStart+x),(yStart+y),p);
我需要尽快填充数组。我该怎么做?

我认为这里的问题是变量
s
e
是在线程外部修改的闭包,因此线程得到了错误的值,并且使用了错误的范围

若要查看是否是这种情况,请尝试添加
控制台.WriteLine()
跟踪.WriteLine()
,以打印线程内
s
e
的值(在调用
QueueUserWorkItem()
之后),以查看是否发生了这种情况

要解决此问题,请将修改后的闭包复制到临时变量中,并在线程中使用这些变量,如下所示:

for (int ii = 0; ii < threadCount; ii++)
{
    int ts = s; // Copy them outside the loop.
    int te = e;
    ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object state)
    {
        for (int x = ts; x < te; x++) // Use the copy here.
for(int ii=0;ii

另请参见

DoWork是否正在执行某些阻塞操作?如果是这样,您最好在每次调用DoWork时将一个新的工作项排队。请注意,QueueUserWorkItem实际上并没有使用并行类中的一个现成循环创建新的threadsConsider。您的情况看起来并不特别。@usr一开始我忽略了这一点,但OP使用.NET 2.0。谢谢当我检查s和e时,所有线程都试图填充所有数组。