C#BackgroundWorker和Invoke

C#BackgroundWorker和Invoke,c#,.net,multithreading,backgroundworker,invoke,C#,.net,Multithreading,Backgroundworker,Invoke,有人能解释一下为什么从BackgroundWorker调用Thread.Sleep会阻止它的执行吗。调用应该导致在UI线程上执行委托,后台线程应该继续执行。但这并没有发生——为什么 public partial class Form1 : Form { public Form1() { InitializeComponent(); BackgroundWorker bgrw = new BackgroundWorker(); bgr

有人能解释一下为什么从
BackgroundWorker
调用
Thread.Sleep
会阻止它的执行吗。调用应该导致在UI线程上执行委托,后台线程应该继续执行。但这并没有发生——为什么

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        BackgroundWorker bgrw = new BackgroundWorker();
        bgrw.DoWork += new DoWorkEventHandler(bgrw_DoWork);

        bgrw.RunWorkerAsync();
    }

    void bgrw_DoWork(object sender, DoWorkEventArgs e)
    {
        Console.WriteLine(DateTime.Now);
        this.Invoke(new Action(() => { Thread.Sleep(2000); })); //should be executed on the UI thread
        Console.WriteLine(DateTime.Now); // This line is executed after 2 seconds
    }       
}

这是一个相当简单的解释<代码>调用是一个阻塞调用。如果要将UI消息循环上的工作异步排队,请改用:

在指定委托的线程上异步执行指定委托 控件的基础句柄是在上创建的


请注意,当前构造的代码毫无意义。我假设您将此用于测试目的。

这是一个相当简单的解释<代码>调用是一个阻塞调用。如果要将UI消息循环上的工作异步排队,请改用:

在指定委托的线程上异步执行指定委托 控件的基础句柄是在上创建的


请注意,当前构造的代码毫无意义。我假设您将此用于测试目的。

“调用应导致在UI线程上执行委托”-是-“后台线程应继续”-否。请查看定义并注意,它的返回值是委托返回的值。在代码完成执行之前,它无法将该值返回给您<代码>调用阻塞。为什么不在启动Backgroundworker后立即从UI线程调用Thread.Sleep()?阅读此“调用应导致在UI线程上执行委托”-是-“后台线程应继续”-否。请查看的定义,并注意其返回值是委托返回的值。在代码完成执行之前,它无法将该值返回给您<代码>调用块。为什么不在启动Backgroundworker后立即从UI线程调用Thread.Sleep()?请阅读以下内容
void bgrw_DoWork(object sender, DoWorkEventArgs e)
{
    Console.WriteLine(DateTime.Now);
    this.BeginInvoke(new Action(() => { Thread.Sleep(2000); })); 
    Console.WriteLine(DateTime.Now);
}