這是我的理解,下面的代碼是安全的,因爲Invoke是同步的,所以索引總是在動作後增加,但我得到了array.ElementAt(index)
行的ArgumentOutOfRangeException報告。在下面的代碼中,修改閉包是否有可能存在錯誤?
數組是一個IEnumerable,它是在此代碼之前由LINQ查詢生成的,因此無法修改。
IEnumerable array = collection.Select(() => .....);
while (index < array.Count())
{
this.CurrentDispatcher.Invoke(new Action(() =>
{
...
object a = array.ElementAt(index)
...
}), DispatcherPriority.Input);
index++;
}
我能想象得到ArgumentOutOfRangeException
的唯一方法是,如果,不知何故,被訪問前陣指數得到提高。
這有可能以任何方式嗎?
什麼是「收藏」?你是否意識到你正在評估'Count'每次調用的'Select'部分以及每次調用'ElementAt'?這裏的名稱「數組」很容易讓人誤解...... –
你的'Enumerable.Select'方法裏面有什麼?每當你調用'ElementAt'和'Count'時,基礎查詢可能會產生不同的結果,因爲你沒有實現查詢 –
好吧,我明白你的意思了。我怎樣才能實現查詢?你能把它當作答案嗎? –