Как я могу запустить метод в потоке и вызвать метод при выходе из потока - PullRequest
1 голос
/ 02 ноября 2010

Я искал ответ на этот вопрос, но не могу найти простой пример, чтобы помочь мне понять. Я пишу приложение Win Form в C #, которое оборачивает кучу инструментов командной строки, используемых для кодирования видео. У меня есть метод с именем encodefiles Я хочу запустить этот метод в потоке, чтобы пользовательский интерфейс все еще мог работать. Когда поток завершен, я хочу, чтобы он вызвал другой метод, чтобы я знал, что он завершен. Затем я могу закодировать следующий файл или закончить. все зависит от того, есть ли еще файлы для кодирования.

Я получал нужное мне действие, когда запускал только один инструмент командной строки, так как я использовал объект процесса, к которому вы можете прикрепить законченное событие. Я хочу то же самое для потока, но понятия не имею, как.

Короче говоря, я хочу иметь возможность делать следующее с потоком вместо процесса

Process myProcess = Process.Start(commandLineExe, commandlineSwitches);
myprocess.EnableRaisingEvents = true;
myprocess.Exited += new EventHandler(myprocess_exited);

Надеюсь, что имеет смысл

Использую c # .NET 3.5 с visual studio 2010

Ответы [ 4 ]

4 голосов
/ 02 ноября 2010

хорошо, если вы используете winforms и хотите запустить задачу в фоновом режиме и уведомить о ее завершении backgroundworker

и обработать DoWork (), WorkerComplete (), progressChanged () события, чтобы сделать вашу работу.

1 голос
/ 02 ноября 2010

Создать еще одну тему.В процедуре потока для этого выполните:

yourMonitoredThread.Join();
CallYourProcedure(); //  can be event

РЕДАКТИРОВАТЬ:

Вы можете получить из Thread и реализовать необходимое событие и использовать его в инкапсулированном виде.

1 голос
/ 02 ноября 2010

Вы смотрели на класс BackgroundWorker ? Это дает вам возможность запускать события «прогресс изменился».

0 голосов
/ 02 ноября 2010

Может быть, что-то вроде этого:

public class MyThread
{
    Thread _thread;

    public MyThread()
    { 
        _thread = new Thread(WorkerMethod);
    }

    public void Start()
    {
        _thread.Start();
    }

    private void WorkerMethod()
    {
        // do something useful
        // [...]

        //Exiting this method = exit thread => trigger event
        Exited(this, EventArgs.Empty);
    }

    public event EventHandler Exited = delegate{};
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...