申し訳ありませんが、ここでは少し問題があります。 ここにループがあります。 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));
}
}
}
はここでそれぞれが
Client
が
socket
含まLazyAsync
public static class LazyAsync
{
public static void Invoke(Action a)
{
a.BeginInvoke(a.EndInvoke, null);
}
}
あるので、私はそれはほとんどClone
することはできません。 問題は、Invoke
をc.WriteMessage
にすると、実行が遅れるため、通常はリストの最初のカップルでは起動せず、実際には最後のアイテムだけが一斉に起動することがあります。
これは、Invoke
が実際に呼び出される前に変更される参照であるCと関係があることは知っていますが、これを避ける方法はありますか?
一般的に、for(int i=0 etc
ループを実行してもこの問題は解決されないようです。
誰でも私がこれをどのように修正することができますか?
Clone
Client
を忘れないでください。
誰かを指すように起こるものは何でも、CにWriteMessageを呼びましたこれをちょうど毎日尋ねる。問題のリンクとディスカッションについては、http://stackoverflow.com/questions/8898925/is-there-a-reason-for-cs-reuse-of-the-variable-in-a-foreach/8899347#8899347を参照してください。 。 –
私は検索しましたが、何も見つかりませんでした。私は試していないのではありません。 –
確かに;これは見つけにくいものです。そういうわけで、この質問がほぼ毎日繰り返し尋ねられるのです。あなたが実際にresharperからの "変更された閉鎖へのアクセス"警告を受け取らない限り、検索するキーワードを知る理由はありません。 –