线程问题 - 阻塞 UI 线程

我正在尝试模拟一个过程,其中按钮依次设置为一种颜色,然后每隔几秒返回到之前的颜色。


问题是,我不完全确定如何在不阻塞 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();

        });

    }


温温酱
浏览 110回答 1
1回答

繁花如伊

Dispatcher.Invoke如果从 UI 单击按钮然后在 UI 线程上单击按钮,则不需要此处。只需循环按钮并更改其颜色即可。没有理由Select只返回虚拟true值。另外,几乎没有理由不使用Task构造函数,尤其是不要在 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;    }}
打开App,查看更多内容
随时随地看视频慕课网APP