У меня есть программа, которая выполняет метод через Поток. Запустить. Метод имеет возвращаемое значение, к которому я хотел бы получить доступ. Существует ли способ сделать это? Вот выборка...
var someValue = "";
Thread t = new Thread(delegate() { someValue = someObj.methodCall(); });
t.Start();
while (t.isAlive) Thread.Sleep(1000);
// Check the value of someValue
Таким образом, после того как цикл с условием продолжения заканчивается, someValue должен быть установлен - но потому что он выполняется в другом потоке, это не становится установленным. Существует ли простой способ получить доступ к нему?
Когда вызывающий и потоковый метод разделяют переменную, вы уже имеете к ней доступ - после завершения потока достаточно проверить someValue
.
Конечно, чтобы это было полезно, вы должны знать, когда завершается работа потокового метода. Внизу, есть два способа сделать это:
Отправить обратный вызов в потоковый метод, который он может выполнить по завершении. Вы можете передать свой метод обратного вызова someValue
. Вы можете использовать этот метод, если вас не волнует, когда будет выполнен обратный вызов.
Используйте WaitHandle
какого-нибудь рода (или Thread.Join
). Это подскажет вам, когда ресурс готов или событие завершено. Эта техника полезна, если вы хотите запустить поток, сделать что-то другое, затем подождите, пока поток не завершится, прежде чем продолжить. (Другими словами, она полезна, если вы хотите синхронизировать резервную копию с потоком, но не сразу.)
Взгляните на Модель асинхронного программирования .
В одном из общих шаблонов, описываемых моделью, ваш класс будет предоставлять методы BeginXXX и EndXXX. Первый запускает асинхронную операцию и возвращает объект IAsyncResult. Последний принимает объект IAsyncResult в качестве аргумента, блокирует вызывающий поток до завершения операции и возвращает требуемое значение.
Я не могу воссоздать вашу проблему, у меня такой же код, и я вижу ожидаемый результат. Если вы просто собираетесь засыпать текущий поток до его завершения, вы можете просто вызвать .Join () в потоке и подождать, чтобы убедиться, что он завершил выполнение.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string someValue = "";
private void Form1_Load(object sender, EventArgs e)
{
Thread t = new Thread(delegate() { someValue = "asdf"; });
t.Start();
t.Join();
//while (t.IsAlive) Thread.Sleep(1000);
System.Diagnostics.Debug.Print(someValue);
}
}