Какой код лучше отложить основной поток, пока рабочий поток делает свою работу - PullRequest
2 голосов
/ 10 сентября 2011

Какой код лучше задерживать (ждать) основного потока, пока рабочий поток выполняет свою работу?

1)

int ticks = System.Environment.TickCount;
while (System.Environment.TickCount - ticks < milliseconds);

2)

Thread.Sleep(milliseconds);

3)

Your variant.

Спасибо.

ДОБАВЛЕНО

РЕШЕНИЕ:

Время ожидания ожидания

Ответы [ 4 ]

5 голосов
/ 10 сентября 2011

Ничего из этого не хорошо. Любой из них приведет к тому, что пользовательский интерфейс перестанет отвечать на запросы, пока рабочий поток выполняет свою работу.

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

Один из способов запуска вещей в потоке пользовательского интерфейса из рабочего потока:

Deployment.Current.Dispatcher.BeginInvoke(() =>
{
   // Your UI thread code to run here.
}

См. Также .

Вы также можете использовать фоновых работников .

3 голосов
/ 10 сентября 2011

Взгляните на это: http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.onrunworkercompleted.aspx

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

2 голосов
/ 10 сентября 2011

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

await предоставляется Async CTP, который еще не завершен, но считается, что он включен в Visual Studio vNext. В частности, Async CTP не работает на Silverlight 5 RC (хотя Silverlight 4 работает).

0 голосов
/ 12 сентября 2011

Я не нашел правильного ответа, поэтому решил исследовать эту проблему более глубоко. Вот код, который не использует Thread.Sleep:

    public void SetReady()
    {
        lock (syncObj)
        {
            ready = true;
            Monitor.Pulse(syncObj);
        }

    }


        public void Wait()
        {
            lock (syncObj)
            {
                while (!ready)
                {
                    Monitor.Wait(syncObj);
                }
            }
        }

Подробнее см .: Тайм-аут ожидания

...