C# 线程问题-阻止UI线程
我试图模拟一个过程,在这个过程中,按钮按顺序被设置为一种颜色,然后每隔几秒钟返回到它们以前的颜色 问题是,我不完全确定如何在不阻塞UI线程的情况下遍历集合。。。我不喜欢使用thread.sleep,但这是我在SO上发现的 有人帮我吗?我在下面的“开始”按钮点击的过账代码C# 线程问题-阻止UI线程,c#,wpf,C#,Wpf,我试图模拟一个过程,在这个过程中,按钮按顺序被设置为一种颜色,然后每隔几秒钟返回到它们以前的颜色 问题是,我不完全确定如何在不阻塞UI线程的情况下遍历集合。。。我不喜欢使用thread.sleep,但这是我在SO上发现的 有人帮我吗?我在下面的“开始”按钮点击的过账代码 private void StartTest_Click(object sender, RoutedEventArgs e) { //tabControl.SelectedIndex = 3;
private void StartTest_Click(object sender, RoutedEventArgs e)
{
//tabControl.SelectedIndex = 3;
// Emulate buttons being processed
Dispatcher.Invoke(() =>
{
new Task(() =>
{
selectedButtons.All(bSelected=>
{
bSelected.Background = resourceDictionary["ProcessingButtonColour"] as Brush;
Thread.Sleep(3000);
bSelected.Background = resourceDictionary["HoverOverColourInactive"] as Brush;
return true;
});
}).Start();
});
}
您不需要
Dispatcher。如果在UI中单击了按钮,则在UI线程中调用。只需在按钮之间循环并更改其颜色。没有理由选择仅返回一个伪true
值。此外,没有理由几乎不使用任务
构造函数,尤其是不在UI线程上运行工作。像这样的方法应该会奏效:
private async void StartTest_Click(object sender, RoutedEventArgs e)
{
foreach (var button in selectedButtons)
{
button.Background = resourceDictionary["ProcessingButtonColour"] as Brush;
await Task.Delay(3000);
button.Background = resourceDictionary["HoverOverColourInactive"] as Brush;
}
}
真棒-谢谢你,伙计。。。。那么,我的理解是错的吗?我需要阅读更多关于异步的信息,并等待。。。我永远也记不清线程“功能”,而且,很快,当这些任务发生时,我如何才能禁用按钮?我猜这会改变一点逻辑你是说当颜色改变的时候?这只是将button.Enabled=false
/button.Enabled=true
放在何处的问题,不是正在更改的实际按钮,而是触发它全部关闭的按钮,即在示例“StartTest”中。我们如何禁用主按钮,直到它全部完成?很抱歉问另一个问题…哦,只需在foreach
之前使用StartTest.Enabled=false,在foreach
之后使用StartTest.Enabled=true