我有一个小应用程序应该将图像设置为红色或绿色,具体取决于所做的一些测试。测试可能需要几秒钟,每个测试都有一个自定义控件,图像连接到它。当我点击开始时,我想要完成第一个测试,通过更改该图像上的图像来显示结果,然后继续。但就像现在一样,所有测试都进行了(可能是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;
}
答案 0 :(得分:0)
在后台运行测试,然后使用Dispatcher更新UI线程: 对于WPF&净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;
}
}});
}
}
});
}
答案 1 :(得分:0)
你应该读入异步并等待并同时执行每个测试并等待结果(显然这假设你的测试不是相互依赖的)
以及
的某种形式的实施Task.Factory.StartNew(() => {
var result = ts.makeTest();
setLight1(result);
})
虽然不知道更多,但似乎可以使用数据绑定到在测试对象列表上实现INotifyPropertyChanged的ViewModel来执行此操作。
但不是异步执行测试是导致问题的主要原因
我知道外部链接在SO中并不是首选,但这是一个教程