我正在向我的后台工作人员显示一个模态对话框,但是当对完成的工作线程事件完成一些长任务时,它会变得无法响应。有人能告诉我它为什么会发生这种情况以及如何解决这个问题吗?
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
var back = new BackgroundWorker();
back.DoWork += delegate
{
int i = 0;
while (i < 100)
{
Thread.Sleep(100);
i++;
}
};
back.RunWorkerCompleted += delegate
{
//running along task on UI therad
int i = 0;
while (i < 10000)
{
int j = 0;
while (j<10000)
{
label.Content = i.ToString();
j++;
}
i++;
}
msgbox.Close();
};
back.RunWorkerAsync();
msgbox.Title = "loading";
msgbox.Owner = this;
msgbox.ShowDialog();
}
答案 0 :(得分:1)
您无法在UI线程上运行任何长时间运行的方法而不会阻止它。单个线程不能同时执行while循环并同时响应用户输入。这是不可能的。
这就是为什么你应该在后台执行任何长时间运行的方法,即在这种情况下在DoWork
事件处理程序中。
RunWorkerCompleted
事件处理程序应仅执行一些与UI相关的快速任务,例如更新标签或类似内容。不要在那里做任何重要事情,因为那时你将阻止UI线程,你的应用程序将无法响应。
答案 1 :(得分:0)
这部分在UI线程中执行:
back.RunWorkerCompleted += delegate
{
//running UI therad
int i = 0;
while (i < 100)
{
Thread.Sleep(100);
label.Content = i.ToString();
i++;
}
msgbox.Close();
};
当您调用Thread.Sleep(100);
时,您将整个UI线程置于睡眠状态。这意味着你的用户界面会睡10秒钟。