C # .net - Как предупредить программу, что поток завершен (управляемый событиями)? - PullRequest
7 голосов
/ 05 апреля 2011

это фрагмент моего класса:

public bool start()
{
   Thread startThread = new Thread(this.ThreadDealer);
   startThread.Start();
   return _start;
}

В ThreadDealer () я устанавливаю логическую переменную "_start" в значение false или true.Что мне сейчас нужно, но, похоже, не могу понять, это событие, чтобы предупредить start () о выполнении оператора return, когда ThreadDealer () - Thread завершил работу.

Я попытался что-то с AutoResetEvent и .WaitOne() но так как у меня есть графический интерфейс, который просто блокирует все, и хотя он делает то, что мне нужно (ждать завершения потока), бесполезно, если он блокирует мой графический интерфейс.

Любая помощь будет оченьоценили.

Ответы [ 2 ]

24 голосов
/ 05 апреля 2011

Что вы хотите сделать - дождаться фонового потока в методе потока пользовательского интерфейса, но все же разрешить отзывчивый пользовательский интерфейс - невозможно.Вам нужно разделить код на две части: одну, выполняемую до запуска (или параллельно) фонового потока, а другую, выполняющуюся после завершения фонового потока.

Самый простой способ - использовать BackgroundWorker класс .Он вызывает событие в потоке пользовательского интерфейса (RunWorkerCompleted) после завершения своей работы.Вот пример:

public void start()
{
    var bw = new BackgroundWorker();

    // define the event handlers
    bw.DoWork += (sender, args) => {
        // do your lengthy stuff here -- this will happen in a separate thread
        ...
    };
    bw.RunWorkerCompleted += (sender, args) => {
        if (args.Error != null)  // if an exception occurred during DoWork,
            MessageBox.Show(args.Error.ToString());  // do your error handling here

        // Do whatever else you want to do after the work completed.
        // This happens in the main UI thread.
        ...
    };

    bw.RunWorkerAsync(); // starts the background worker

    // execution continues here in parallel to the background worker
}
6 голосов
/ 05 апреля 2011

Просто поднять событие. Он будет работать в неправильном потоке, поэтому любой обработчик событий должен иметь дело с этим путем маршалинга вызова, если необходимо обновить любой пользовательский интерфейс. Используя Control.Begin / Invoke или Dispatcher.Begin / Invoke, в зависимости от используемой вами библиотеки классов.

Или используйте класс BackgroundWorker, он делает это автоматически.

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