C# 在工作线程执行其工作时,延迟主线程哪个代码更好

C# 在工作线程执行其工作时,延迟主线程哪个代码更好,c#,multithreading,performance,.net-3.5,C#,Multithreading,Performance,.net 3.5,在工作线程执行其工作时,延迟(等待)主线程更好的代码是什么 (一) (三) 多谢各位 已添加 解决方案: 这些东西都不好。任何一个都会导致UI在工作线程执行其工作时变得无响应 相反,您应该安排工作项在工作线程上运行,然后在工作完成后将消息发送回UI线程 从工作线程在UI线程上运行东西的一种方法是: Deployment.Current.Dispatcher.BeginInvoke(() => { // Your UI thread code to run here. } 您还可以

在工作线程执行其工作时,延迟(等待)主线程更好的代码是什么

(一)

(三)

多谢各位

已添加

解决方案:


这些东西都不好。任何一个都会导致UI在工作线程执行其工作时变得无响应

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

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

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

您还可以使用。

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

wait
由异步CTP提供,该CTP尚未最终确定,但一般认为包含在Visual Studio vNext中。特别是,异步CTP在Silverlight 5 RC上不起作用(尽管Silverlight 4起作用)。

看看这个:


假设您使用的是后台工作者类,那么这应该可以满足您的所有需要。正如在另一个答案中所述,您提供的解决方案将使您的程序陷入困境,无法使用另一个线程。

我没有找到有效的答案,因此决定更深入地研究这个问题。 以下是不使用线程的代码。睡眠:

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

    }


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

有关更多详细信息,请参阅:

如果您阻止主线程等待工作线程,那么为什么您有一个工作线程?我不确定我是否会为可能的生产应用程序推荐CTP代码……这是一个选项。比阻塞更好,比
调度程序
+1更具可移植性,但您应该提到它是CTP,尚未“正式发布”。如果您执行
等待任务,我将+1告诉您。延迟(毫秒)
更清楚。@Brian:我相信op使用短阻塞等待来进行轮询。如果我是对的,那么他们应该真正等待后台操作结果,而不是延迟。BackgroundWorker是组件,我没有提到UI(.我正在使用非可视组件BackgroundWorker是组件,我没有提到UI.:。我正在使用非可视组件
Your variant.
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
   // Your UI thread code to run here.
}
    public void SetReady()
    {
        lock (syncObj)
        {
            ready = true;
            Monitor.Pulse(syncObj);
        }

    }


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