Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Завершение потока из которого вызывалась функция

3.0K
13 мая 2007 года
Oxaid
63 / / 02.04.2006
Привет! Хотел вот спросить. Если у меня есть поток, например такого вида:

Код:
private void myThread()
{
     // А тут вызывается другой метод
     anyMethod();
}

private void anyMethod()
{
     // тут что-то происходит длительное по времени
     //...
}


То прога вывалится. Дык вот. Таким образом вызов метода не входит в поток, я правильно понимаю? Или все таки является частью потока? Тогда почему вываливается. И есть ли смысл делать методы static.
Проблемы большой нет, как исправить я знаю. Я лишь хочу понять является ли вызов метода из потока частью этого потока и если да, то почему, когда переходит в этот метод, говорит о том, что основной поток завершен.
406
14 мая 2007 года
vitaly2003s
481 / / 27.07.2004
Не совсем понял что ты имеешь ввиду,но про то что данный метод является частью потока - отвечу является.
273
14 мая 2007 года
3A3-968M
1.2K / / 22.12.2005
Есть два варианта запуска метода в другом потоке - через класс Thread или через асинхронный вызов делегата. Через Thread так:
Код:
[SIZE=2][COLOR=#0000ff][FONT=Courier New]static [/FONT][/COLOR][/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]void [/COLOR][/SIZE][SIZE=2]Main([/SIZE][SIZE=2][COLOR=#0000ff]string[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New][] args)[/FONT]
[FONT=Courier New]{[/FONT]
[FONT=Courier New]  System.Threading.[/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]Thread[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] simpleThread = [/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]new [/COLOR][/SIZE][SIZE=2]System.Threading.[/SIZE][SIZE=2][COLOR=#008080]Thread[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#0000ff]new [/COLOR][/SIZE][SIZE=2]System.Threading.[/SIZE][SIZE=2][COLOR=#008080]ThreadStart[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New](AsyncHelloWorld));[/FONT]
[FONT=Courier New]  simpleThread.Start();[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]  while[/COLOR][/SIZE][SIZE=2] (simpleThread.ThreadState != System.Threading.[/SIZE][SIZE=2][COLOR=#008080]ThreadState[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New].Stopped)[/FONT]
[FONT=Courier New]  {[/FONT]
[/SIZE][SIZE=2][COLOR=#008000][FONT=Courier New]//Ожидание остановки потока[/FONT]
[/COLOR][/SIZE][SIZE=2][FONT=Courier New]  }[/FONT]
[FONT=Courier New][/FONT]
[FONT=Courier New]}[/FONT]
[FONT=Courier New][/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]static [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]void [/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New]AsyncHelloWorld()[/FONT]
[FONT=Courier New]{[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]  for[/COLOR][/SIZE][SIZE=2] ([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] i = 0; i < 1000; i++)[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]    Console[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New].Write(i);[/FONT]
[FONT=Courier New]}[/FONT]
[/SIZE]

Или тоже самое через делегат:
 
Код:
[SIZE=2][FONT=Courier New]System.Threading.[/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]ThreadStart[/COLOR][/SIZE][SIZE=2] simpleThread = [/SIZE][SIZE=2][COLOR=#0000ff]new [/COLOR][/SIZE][SIZE=2]System.Threading.[/SIZE][SIZE=2][COLOR=#008080]ThreadStart[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New](AsyncHelloWorld);[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]IAsyncResult[/COLOR][/SIZE][SIZE=2] result = simpleThread.BeginInvoke([/SIZE][SIZE=2][COLOR=#0000ff]delegate[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#008080]IAsyncResult[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] asyncResult)[/FONT]
[FONT=Courier New]{ [/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]Console[/COLOR][/SIZE][SIZE=2].WriteLine([/SIZE][SIZE=2][COLOR=#800000]"End of thread"[/COLOR][/SIZE][SIZE=2]); }, [/SIZE][SIZE=2][COLOR=#0000ff]null[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New]);[/FONT]
[FONT=Courier New]System.Threading.[/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]WaitHandle[/COLOR][/SIZE][SIZE=2].WaitAll([/SIZE][SIZE=2][COLOR=#0000ff]new [/COLOR][/SIZE][SIZE=2]System.Threading.[/SIZE][SIZE=2][COLOR=#008080]WaitHandle[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New][] { result.AsyncWaitHandle });[/FONT]
[FONT=Courier New]simpleThread.EndInvoke(result);[/FONT]
[/SIZE]

Естественно, что метод, вызванный в другом потоке и будет выполняться в его контексте.
3.0K
15 мая 2007 года
Oxaid
63 / / 02.04.2006
Т.е если я правильно понял, то, если у меня есть класс и я запускаю какой-либо его метод в поток, а внутри этого потока вызываю другой метод этого класса, то пока не завершится ... короче:
Код:
public class myClass
{
    public void start()
    {
         Thread thr = new Thread(new ThreadStart(myThread));
         thr.Start();
    }

     public void myThread
     {
          anyMethod();
     }

     public void anyMethod()
     {
          // Some do...
     }
}


если я из myThread вызываю anyMethod, то пока anyMethod не завершится поток myThread тоже будет считатся запущеным?
713
15 мая 2007 года
Ap0k
360 / / 13.03.2006
Да, конечно.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог