好的,所以我在這裏遇到了一些問題。 這是循環。c#foreach with Action.BeginInvoke
lock (ClientLocker)
{
Trace.WriteLine("#WriteAll: " + sm.Header);
foreach (Client c in Clients)
{
if (c.LoggedIn)
{
Trace.WriteLine("#TryWriteTo[" + c.Id + "](" + sm.Header + ")");
LazyAsync.Invoke(() => c.WriteMessage(sm));
}
}
}
這裏是LazyAsync
public static class LazyAsync
{
public static void Invoke(Action a)
{
a.BeginInvoke(a.EndInvoke, null);
}
}
每個Client
包含socket
,所以我不能幾乎Clone
它。 問題是,當我執行Invoke
到c.WriteMessage
時,由於執行延遲,它通常不會觸發列表中的第一對,並且有時實際上只會激發最後一個項目中的大部分。
我知道這與c是在Invoke
實際被調用之前更改的引用有關,但有沒有辦法避免這種情況?
做一般的for(int i=0 etc
循環似乎並沒有解決這個問題。
任何人有任何想法,我怎麼能解決這個問題?
請記住,不能Clone
Client
。
有人的WriteMessage幾乎每天都會問這個問題。有關此問題的一些鏈接和討論,請參閱http://stackoverflow.com/questions/8898925/is-there-a-reason-for-cs-reuse-of-the-variable-in-a-foreach/8899347#8899347 。 –
我做了一個搜索,但沒有找到任何東西。不像我沒試過。 –
確實;這是一個很難找到的。這就是爲什麼幾乎每天都會問這個問題的原因。除非您真的從resharper獲得「訪問修改後的關閉」警告,否則沒有理由爲什麼您會知道要搜索哪些關鍵字。 –