Хорошо, поэтому у меня есть небольшая проблема здесь.Вот цикл.
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
.