什么代码更好地延迟主线程工作线程正在做它的工作

时间:2011-09-09 22:19:17

标签: c# multithreading performance .net-3.5

什么代码更好地在工作线程工作时延迟(等待)主线程?

1)

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

2)

Thread.Sleep(milliseconds);

3)

Your variant.

谢谢。

ADDED

SOLUTION:

Wait Timeouts

4 个答案:

答案 0 :(得分:5)

这些都不好。当工作线程正在工作时,任何一个都会导致UI无响应。

相反,您应该安排工作项在工作线程上运行,然后在工作完成时将消息发送回UI线程。

从工作线程在UI线程上运行的一种方法是:

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

See also

您也可以使用background workers

答案 1 :(得分:3)

看看这个:http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.onrunworkercompleted.aspx

假设您使用的是后台工作者类,这应该可以满足您的所有需求。正如另一个答案中所说,你提供的解决方案会让你的程序陷入困境,从而打败另一个主题。

答案 2 :(得分:2)

您可以await您的后台操作异步等待直到完成。我不建议通过阻止一段时间来完成轮询。

await由Async CTP提供,但尚未最终确定,但通常认为它包含在Visual Studio vNext中。特别是,Async CTP在Silverlight 5 RC上不起作用(尽管Silverlight 4确实有效)。

答案 3 :(得分:0)

我没有找到有效的答案,所以决定更深入地研究这个问题。 这是不使用Thread.Sleep的代码:

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

    }


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

有关详情,请参阅:Wait Timeouts

相关问题