Есть класс:
class Foo : IDisposable
{
void IDisposable.Dispose() { }
public void Dispose() { }
private MyObj obj = null;
...
void Run ()
{
...
obj = new MyObj();
...
}
...
}
static class Program
{
static void Main(string[] args)
{
using (Foo foo = new Foo())
{
foo.Run();
...
}
...
}
}
Метод Run с помошью Invoke исполняется другом потоке, и там же создается экземпляр obj.
Далее работа Foo предполагается в основном потоке.
В с++ при разрушении obj произошло бы исключения изза того что obj был создан на другой куче.
Насколько правомерен и корректен(мало ли
подобный код в .NET, и какими последствиями чреват такой код, если он некорректен?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, sharcUs, Вы писали:
U>Есть класс:
U>U>class Foo : IDisposable
U>{
U> void IDisposable.Dispose() { }
U> public void Dispose() { }
U> private MyObj obj = null;
U> ...
U> void Run ()
U> {
U> ...
U> obj = new MyObj();
U> ...
U> }
U> ...
U>}
U>static class Program
U>{
U> static void Main(string[] args)
U> {
U> using (Foo foo = new Foo())
U> {
U> foo.Run();
U> ...
U> }
U> ...
U> }
U>}
U>
U>Метод Run с помошью Invoke исполняется другом потоке, и там же создается экземпляр obj.
U>Далее работа Foo предполагается в основном потоке.
U>В с++ при разрушении obj произошло бы исключения изза того что obj был создан на другой куче.
U>Насколько правомерен и корректен(мало ли подобный код в .NET, и какими последствиями чреват такой код, если он некорректен?
корректен. Но тут вообще трудно что-то сказать без полного кода.
Кстати, в с++ в этом случае никаких исключений не будет. В win у всех потоков, принадлежащих одному процессу куча одна.
Здравствуйте, Константин Л., Вы писали:
КЛ>корректен. Но тут вообще трудно что-то сказать без полного кода.
КЛ>Кстати, в с++ в этом случае никаких исключений не будет. В win у всех потоков, принадлежащих одному процессу куча одна.
в приведенном коде допустил ошибку которая, противоречит тексту после кода и может вводить в заблужение
конечно не:
foo.Run();
...
а что то вроде такого:
run_delegate methodDelegate = new run_delegate(obj.Run);
AsyncCallback async = new AsyncCallback(CallBack);
methodDelegate.BeginInvoke(async, mytask);
...
Собственно говоря в Run происходит инициализация obj которая занимает достаточно продолжительное время, что бы решить вынести ее в отдельный поток.
До завершения инициализации в Run работа с Foo осуществлятся не будет, поэтому проблемы синхронизации здесь нет. После отработки Run
осуществляется работа с obj через Foo в основном потоке без каких-либо ньюансов, и при завершении работы программы Foo уничтожается.
Интересует корректность подобной функциональности именно с точки зрения работы с памятью в .NET, когда создание объекта осуществляется в одном потоке, а работа с ним и его disposing осуществялется в другом потоке.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, Константин Л., Вы писали:
КЛ>Здравствуйте, sharcUs, Вы писали:
КЛ>[]
U>>Собственно говоря в Run происходит инициализация obj которая занимает достаточно продолжительное время, что бы решить вынести ее в отдельный поток.
U>>До завершения инициализации в Run работа с Foo осуществлятся не будет, поэтому проблемы синхронизации здесь нет. После отработки Run
U>>осуществляется работа с obj через Foo в основном потоке без каких-либо ньюансов, и при завершении работы программы Foo уничтожается.
КЛ>а что делает в это время главный поток? Просто ждет когда проинициализируется объект? Если да, то перенос инициализации в доп. поток не имеет смысла.
U>>Интересует корректность подобной функциональности именно с точки зрения работы с памятью в .NET, когда создание объекта осуществляется в одном потоке, а работа с ним и его disposing осуществялется в другом потоке.
КЛ>это корректно, но не слишком "правильно" с точки зрения дизайна. Хотя могут быть разные ситуации...
метод Run в качестве делегата передается диалогу с прогресБаром, где отображается индикатор выполнения операции инициализации
там он и запускается в отдельном потоке. Отдельный поток нужен для того что бы не мешать нормальной отрисовке графической части программы.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>