Возвращаемое значение доступа от Потока. Запустите () функцию делегата

У меня есть программа, которая выполняет метод через Поток. Запустить. Метод имеет возвращаемое значение, к которому я хотел бы получить доступ. Существует ли способ сделать это? Вот выборка...

var someValue = "";
Thread t = new Thread(delegate() { someValue = someObj.methodCall(); });

t.Start();

while (t.isAlive) Thread.Sleep(1000);

// Check the value of someValue

Таким образом, после того как цикл с условием продолжения заканчивается, someValue должен быть установлен - но потому что он выполняется в другом потоке, это не становится установленным. Существует ли простой способ получить доступ к нему?

6
задан bugfixr 21 December 2009 в 19:58
поделиться

3 ответа

Когда вызывающий и потоковый метод разделяют переменную, вы уже имеете к ней доступ - после завершения потока достаточно проверить someValue.

Конечно, чтобы это было полезно, вы должны знать, когда завершается работа потокового метода. Внизу, есть два способа сделать это:

  • Отправить обратный вызов в потоковый метод, который он может выполнить по завершении. Вы можете передать свой метод обратного вызова someValue. Вы можете использовать этот метод, если вас не волнует, когда будет выполнен обратный вызов.

  • Используйте WaitHandle какого-нибудь рода (или Thread.Join). Это подскажет вам, когда ресурс готов или событие завершено. Эта техника полезна, если вы хотите запустить поток, сделать что-то другое, затем подождите, пока поток не завершится, прежде чем продолжить. (Другими словами, она полезна, если вы хотите синхронизировать резервную копию с потоком, но не сразу.)

6
ответ дан 8 December 2019 в 17:22
поделиться

Взгляните на Модель асинхронного программирования .

В одном из общих шаблонов, описываемых моделью, ваш класс будет предоставлять методы BeginXXX и EndXXX. Первый запускает асинхронную операцию и возвращает объект IAsyncResult. Последний принимает объект IAsyncResult в качестве аргумента, блокирует вызывающий поток до завершения операции и возвращает требуемое значение.

0
ответ дан 8 December 2019 в 17:22
поделиться

Я не могу воссоздать вашу проблему, у меня такой же код, и я вижу ожидаемый результат. Если вы просто собираетесь засыпать текущий поток до его завершения, вы можете просто вызвать .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);

    }
}
5
ответ дан 8 December 2019 в 17:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: