Чтобы ответить на ваш вопрос первый: ThreadStart
просто делегат. Это используется для «передачи метода» экземпляру потока. Затем этот метод выполняется в контексте нового потока.
Существует два типа: ThreadStart
- это простые методы, не требующие параметров. ParameterizedThreadStart
используется, если вы хотите передать аргумент в поток.
Метод потока не может возвращать значения.То, что вы обычно делаете, это определить «объект состояния», который вы передаете в поток, который затем может изменять его содержимое (что, кстати, также является чистым способом предоставления параметров для потока). После того, как поток закончится, вы получите свой результат.
Я знаю, что есть более простые способы, как BackgroundWorker
с или Task
с, но вы просили специально для Thread
с, так что здесь мы идем:
Нам нужен простой объект состояния, который будет содержать результат этого потока:
private class ThreadResult
{
public string Result;
}
Теперь нам нужен метод, который вы хотите позвонить без использования резьбы:
public string PerformSomething()
{
return "Hello World";
}
Теперь нам нужен метод потока, который будет запускаться в другом потоке. Мы просто вызываем этот метод методом PerformSomething
и сохраняем результат в объекте состояния. Обратите внимание, что PerformSomething
также будет называться в контексте вызывающего потока - так что вы должны убедиться, что для обработки пользовательского интерфейса обновления правильно и сделать его поточно-(это выходит за рамки данной темы):
public string StartProcess(object state)
{
ThreadResult result = (ThreadResult)state;
result.Result = PerformSomething();
}
Теперь мы начать новую тему и сделать его сделать что-то:
ThreadResult myResult = new ThreadResult();
Thread t = new Thread(ParameterizedThreadStart(StartProcess));
t.Start(myResult);
// Wait for the thread to end
t.Join();
// Evaluate the result
Console.WriteLine(myResult.Result);
Как это не имеет особого смысла нерест нить, а затем еще заблокировать приложение, чтобы ждать его до конца, мы это немного изменить. Предположим, что вы создаете нить каким-то способом. Затем поток выполнит свою работу и запустит другой метод, когда он будет завершен. Затем вы можете обрабатывать результат асинхронно.
public void SomeMethodThatStartsTheThread()
{
ThreadResult myResult = new ThreadResult();
Thread t = new Thread(new ParameterizedThreadStart(StartProcess));
t.Start(myResult);
// We can do other work while the thread is running
}
public string StartProcess(object state)
{
ThreadResult result = (ThreadResult)state;
result.Result = PerformSomething();
ThreadIsDone(result);
}
public void ThreadIsDone(ThreadResult result)
{
// Do stuff you want to do when the thread is done
}
Пожалуйста, обратите внимание, что ThreadIsDone
также называют в контексте потока вы порождал в SomeMethodThatStartsTheThread
.
Простой веб-поиск показывает несколько достоверных результатов, включая [этот поток MSDN] (http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/c43c0cce-491a-4ddb-9012-69929fab8e5e/) –
Как вы можете вернуть строку, когда ваш метод возвращает void? – Zenwalker
@zenwalker - тип возврата void является обязательным для [делегирования ThreadStart] (http://msdn.microsoft.com/en-us/library/system.threading.threadstart.aspx) –