我在for循環中創建System.Threading.Tasks
,然後在同一循環內運行ContinueWith
。for循環與System.Threading.Tasks中的奇怪行爲
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.對於某些原因,少於預期的任務實際完成(例如,即使85個任務預計要創建的基礎上,循環計數器最大值160,000除以2,048 = 78的迭代值,只出現77個彈出窗口) - 編輯檢查控制檯,很明顯循環計數器在突然停止之前一直增加到約157,696。
我真的很困惑任務和線程,所以如果你可以有任何的幫助,這將是非常有用的 - 在此先感謝。
編輯我已經做了道格拉斯建議的更改,它解決了我的第一個問題 - 我仍然堅持第二個問題。
你試過只是做了控制檯輸出,以確保有*絕對*與線程的問題沒有完成?就我個人而言,我認爲應用程序中的70多個彈出窗口的想法是...... – James
我試過控制檯輸出,並且在停止之前它又一次起來,直到157,000 – FireOak