private void myThread()
{
// А тут вызывается другой метод
anyMethod();
}
private void anyMethod()
{
// тут что-то происходит длительное по времени
//...
}
Завершение потока из которого вызывалась функция
Код:
То прога вывалится. Дык вот. Таким образом вызов метода не входит в поток, я правильно понимаю? Или все таки является частью потока? Тогда почему вываливается. И есть ли смысл делать методы static.
Проблемы большой нет, как исправить я знаю. Я лишь хочу понять является ли вызов метода из потока частью этого потока и если да, то почему, когда переходит в этот метод, говорит о том, что основной поток завершен.
Не совсем понял что ты имеешь ввиду,но про то что данный метод является частью потока - отвечу является.
Код:
[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]
[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]
[/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]
Естественно, что метод, вызванный в другом потоке и будет выполняться в его контексте.
Код:
public class myClass
{
public void start()
{
Thread thr = new Thread(new ThreadStart(myThread));
thr.Start();
}
public void myThread
{
anyMethod();
}
public void anyMethod()
{
// Some do...
}
}
{
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 тоже будет считатся запущеным?
Да, конечно.