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);
}