У меня есть клиентское серверное приложение с активированным удаленным клиентом .NET.Я использую Visual Studio 2010, ориентируясь на .NET Framework 4. Когда я запускаю без отладки, программа работает нормально - клиенты не могут подключиться без проблем.Но когда я пытаюсь отладить, в строке в клиентском коде, где у меня есть оператор 'new', сервер (я думаю) выдает исключение.
Я хочу сохранить ссылки на удаленные объекты, созданные в коде сервера.Итак, в конструкторе моего Remote Object у меня есть эта строка:
Cache.GetInstance().addFireFighter(this);
Когда я отлаживаю, этот код тоже работает нормально.Но когда он возвращается к строке удаленного объекта, чтобы вызвать метод addFireFighter
, именно тогда он падает.Вот метод addFireFighter
:
public static IServer _server;
public void addFireFighter(FireFighter ff)
{
_server.addFireFighter(ff);
}
И метод _server.addFireFighter
:
public void addFireFighter(FireFighterResponder.FireFighter ff)
{
_ffList.Add(ff); // -> works fine :S
Console.WriteLine("FireFighterResponder addFireFighter added");
lstBox.Items.Add(ff); //-> CRASH!!
}
Замечание: Когда я запускаю сервер без отладки, но запускаю клиент в режиме отладки, онвсе еще работает нормально.
Это школьный проект, и я новичок в C # .NET remoting.Я реализовал то же самое в Java и не было никаких проблем.Так что я могу дать весь свой проект, если кто-то захочет посмотреть на него.Возможно, у меня есть недостаток дизайна.
Вот трассировка стека:
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: Cross-thread operation not valid: Control 'lstBox' accessed from a thread other than the thread it was created on.
at System.Windows.Forms.Control.get_Handle()
at System.Windows.Forms.ListBox.NativeAdd(Object item)
at System.Windows.Forms.ListBox.ObjectCollection.AddInternal(Object item)
at System.Windows.Forms.ListBox.ObjectCollection.Add(Object item)
at FirefighterMonitorSystem.BaseStation.addFireFighter(FireFighter ff) in C:\Users\Dula\Documents\My Dropbox\Firefighter\453\FirefighterMonitorSystem\FirefighterMonitorSystem\BaseStation.cs:line 35
at FireFighterResponder.Cache.addFireFighter(FireFighter ff) in C:\Users\Dula\Documents\My Dropbox\Firefighter\453\FirefighterMonitorSystem\FireFighterResponder\Cache.cs:line 33
at FireFighterResponder.FireFighter..ctor() in C:\Users\Dula\Documents\My Dropbox\Firefighter\453\FirefighterMonitorSystem\FireFighterResponder\FireFighter.cs:line 20
--- End of inner exception stack trace ---
lstBox
- это .NET ListBox
в коде моего сервера, где я добавляю каждый удаленный объект.Но меня все еще смущает, почему он работает, когда не в режиме отладки.