Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线程问题-阻止UI线程_C#_Wpf - Fatal编程技术网

C# 线程问题-阻止UI线程

C# 线程问题-阻止UI线程,c#,wpf,C#,Wpf,我试图模拟一个过程,在这个过程中,按钮按顺序被设置为一种颜色,然后每隔几秒钟返回到它们以前的颜色 问题是,我不完全确定如何在不阻塞UI线程的情况下遍历集合。。。我不喜欢使用thread.sleep,但这是我在SO上发现的 有人帮我吗?我在下面的“开始”按钮点击的过账代码 private void StartTest_Click(object sender, RoutedEventArgs e) { //tabControl.SelectedIndex = 3;

我试图模拟一个过程,在这个过程中,按钮按顺序被设置为一种颜色,然后每隔几秒钟返回到它们以前的颜色

问题是,我不完全确定如何在不阻塞UI线程的情况下遍历集合。。。我不喜欢使用thread.sleep,但这是我在SO上发现的

有人帮我吗?我在下面的“开始”按钮点击的过账代码

    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