Выполнить оператор после того, как поток закончится - PullRequest
1 голос
/ 18 марта 2009

У меня есть функция, где я использовал поток в c # .net.

У меня есть другая функция в следующей строке этого потока. Но эта функция должна вызываться только после выполнения потока.

Как я могу это сделать?

Пример ..

Somefunction()
{
    // thread        //(thread started)
    add()            (another function but need to be executed only tha above thread gets over)
}

Ответы [ 7 ]

5 голосов
/ 18 марта 2009

Используйте BackgroundWorker и включите вызов функции в обработчик завершенных работником событий.

var worker = new BackgroundWorker();
_worker.DoWork += delegate { DoStuff(); };    
_worker.RunWorkerCompleted += worker_RunWorkerCompleted;
_worker.RunWorkerAsync();


[...]

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
   /// Do post-thread stuff
}
3 голосов
/ 18 марта 2009

Используйте Thread.Join , чтобы заблокировать текущий поток, пока указанный поток не завершит выполнение.

2 голосов
/ 18 марта 2009

Зачем запускать отдельный поток, если вы хотите, чтобы выполнение было однопоточным?

1 голос
/ 18 марта 2009

на "после выполнения потока", вы имеете в виду, что он должен запущен ? или он должен иметь готово ?

Если вы имеете в виду закончено, то вы, как правило, Join() ните, но нет никакого смысла Join() нить, которую вы рассматривали в строке ранее (просто выполните код напрямую). Другой подход заключается в использовании «обратного вызова» в конце многопоточного метода.

Если вы имеете в виду, начал, то вы можете сделать такие вещи, как:

object lockObj = new object();
lock(lockObj) {
    ThreadPool.QueueUserWorkItem(delegate {
        lock(lockObj) {
            Monitor.Pulse(lockObj);
        }
        // do things (we're on the second thread...)
    });
    Monitor.Wait(lockObj);
}
// thread has definitely started here
0 голосов
/ 18 марта 2009

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

Сначала создайте делегата:

public delegate int MyThreadSignature(Something arg);

Затем используйте шаблон Begin / End Invoke:

var thread = new MyThreadSignature(WorkerMethod);
thread.BeginInvoke(theArg, 
                   MyThreadEnded, /*Method to call when done*/, 
                   thread /*AsyncState*/);

Создайте метод MyThreadEnded:

void MyThreadEnded(IAsyncResult result)
{
    var thread = (MyThreadSignature)result.AsyncState;
    var result = thread.EndInvoke(result);
    // Call your next worker here.
}

Метод для вызова ДОЛЖЕН иметь подпись в примере: Имя (результат IAsyncResult).

0 голосов
/ 18 марта 2009

Если add () является потокобезопасным, просто вызовите его в конце функции, которую вы передаете, чтобы создать поток.

0 голосов
/ 18 марта 2009

Вы можете использовать, например, ManualResetEvent. Когда вы запускаете обработку в другом потоке, вы вызываете метод сброса. Когда обработка в другом потоке закончена, вы вызываете set. Затем метод, который должен быть выполнен в «главном потоке», должен дождаться, пока не будет установлено значение ManualResetEvent, прежде чем он сможет выполняться.

Для получения дополнительной информации вы можете взглянуть на ManualResetEvent на MSDN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...