0

我有一个小应用程序,它应该根据所做的一些测试将图像设置为红色或绿色。测试可能需要几秒钟,并且每个都有一个自定义控件,其中连接了一个图像。当我单击开始时,我希望完成第一个测试,通过更改该图像上的图像来显示结果,然后继续。但就像现在一样,所有的测试都完成了(可能需要 10 秒),然后所有的灯都在同时改变。如何在执行期间强制自定义控件更新图像?

private void start_Click(object sender, RoutedEventArgs e)
    {
        foreach (TestObject tObj in tObjList)
        {
            bool testResult = tObj.makeTest();
            foreach (TestShower ts in m_TSList)
            {
                if (tObj == ts.gettObj())
                {
                    if (testResult == true)
                        ts.setLightOn();
                    else
                        ts.setLightOff();

                    ts.UpdateLayout();
                    break;
                }
            }
        }
    }    

public void setLightOn()
    {
        string strUri2 = String.Format(@"pack://application:,,,/;component/Images/Signal_On.png");
        BitmapImage img = new BitmapImage(new Uri(strUri2));
        iStatus.Source = null;
        iStatus.Source = img;
    }

public void setLightOff()
    {
        string strUri2 = String.Format(@"pack://application:,,,/;component/Images/Signal_Off.png");
        BitmapImage img = new BitmapImage(new Uri(strUri2));
        iStatus.Source = null;
        iStatus.Source = img;
    }
4

2 回答 2

0

在后台运行测试,然后使用 Dispatcher 更新 UI 线程:对于 WPF 和 Net 4.5。你可以使用 TPL

private void start_Click(object sender, RoutedEventArgs e)
{
    Task.Run(()=>{
    foreach (TestObject tObj in tObjList)
    {
        bool testResult = tObj.makeTest();
        Dispatcher.Invoke(()=>{
        foreach (TestShower ts in m_TSList)
        {
            if (tObj == ts.gettObj())
            {
                if (testResult == true)
                    ts.setLightOn();
                else
                    ts.setLightOff();

                ts.UpdateLayout();
                break;
            }
        }});
       }
    }
  });
}    
于 2013-10-24T13:01:47.207 回答
0

您应该阅读 Async 并等待并同时执行每个测试并等待结果(显然这假设您的测试不是相互依赖的)

和某种形式的实施

Task.Factory.StartNew(() => {
var result = ts.makeTest();
setLight1(result);

})

尽管不了解更多信息,但您似乎可以使用数据绑定到在测试对象列表上实现 INotifyPropertyChanged 的​​ ViewModel 来执行此操作。

但不异步执行测试是您问题的主要原因

我知道外部链接在 SO 中并不是真正的首选,但这里有一个教程

http://www.youtube.com/watch?v=ZyFL3hjHADs

于 2013-10-24T13:02:47.647 回答