for ループ内から作成してから、同じループ内でSystem.Threading.Tasks
a を実行しています。ContinueWith
int[,] referencedArray = new int[input.Length / 4, 5];
for (int i = 0; i <= input.Length/4; i += 2048)
{
int[,] res = new int[input.Length / 4, 5];
int[,] arrayToReference = new int[input.Length / 4, 5];
Array.Clear(arrayToReference, 0, arrayToReference.Length);
Array.Copy(input, i, arrayToReference, 0, input.Length / 4);
Task<Tuple<int[,], int>> test = Task.Factory.StartNew(() => addReferences(arrayToReference, i));
test.ContinueWith(t => { Array.Copy(t.Result.Item1, 0, referencedArray, t.Result.Item2, input.Length / 4); MessageBox.Show("yai", t.Result.Item2.ToString()); });
Array.Copy(res, 0, referencedArray, i, input.Length / 4);
addReference sbroutine は次のとおりです。
public Tuple<int[,],int> addReferences(int[,] input, int index)
{
for (int i = 0; i < 2048; i++)
{
for (int j = 0; j < i; j++)
{
if ((input[i, 0] == input[j, 0]) && (input[i, 1] == input[j, 1]) && (input[i, 2] == input[j, 2]) && (input[i, 3] == input[j, 3]))
{
input[i, 4] = (j - i);
}
}
}
}
return new Tuple<int[,],int>(input,index);
}
しかし、私は本当に奇妙な結果を得ています:
1.インデックス(タスク起動時のループカウンタから生成)がなぜか大きくなりすぎている。これは、ループ カウンターが最大値を超えてインクリメントされ、ループが停止したためだと最初は考えていましたが、continueWith
実行時に新しい値が使用されました。ただし、ループカウンターの値をタスクのindex
開始時と同じようにタスクに送信しても、エラーは解決しません。編集:解決済み
元の数を間違えました
2.何らかの理由で、予想よりも少ないタスクが実際に完了します (たとえば、最大 160,000 のループ カウンターを 2,048 = 78 の反復で割ると、85 のタスクが作成されると予想されますが、77 のポップアップしか表示されません) -編集チェックコンソールを見ると、ループ カウンターが約 157,696 まで上がってから突然停止したことがわかります。
Tasks と Threading については本当に混乱しています。
編集ダグラスが提案した変更を加えました。これにより、最初の問題が解決されました.2番目の問題はまだ解決していません。