【发布时间】:2015-11-21 02:14:53
【问题描述】:
我有这个函数,它接收一个数字输出引脚地址 uscita 作为整数和状态高作为布尔值,并更新引脚输出并在 UI 上的类似 LED 的椭圆中填充红色。
Private Function comandaUscita(ByVal uscita As Integer, ByVal high As Boolean) As Boolean
If high Then
Select Case uscita
Case 1
If gpin1 IsNot Nothing Then gpin1.Write(GpioPinValue.High)
LED1.Fill = redBrush
Case 2
If gpin1 IsNot Nothing Then gpin2.Write(GpioPinValue.High)
LED2.Fill = redBrush
...
End Select
Return True
End If
End Function
该函数每 500 毫秒通过一个计时器调用一次。 调试显示该功能只工作一次。 从第二次和所有其他时间开始,该函数都会引发异常
应用程序调用了一个接口,该接口被编组为 不同的线程。 (来自 HRESULT 的异常:0x8001010E (RPC_E_WRONG_THREAD))
如果不使用 f... 调度程序和类似的繁琐东西,我怎样才能防止这种情况发生。 此外,如果不存在 .Refresh 方法,如何在不使用 f... 调度程序的情况下再次刷新 UIelements?
旧的winforms没有这些问题......啊,旧时代。
我的 UI XAML 看起来像这样:
<StackPanel HorizontalAlignment="Center"
VerticalAlignment="Center"
Height="60"
Margin="10,10,10,569"
Width="340">
<TextBlock x:Name="DelayText1"
Text="Uscita digitale 1"
Margin="10"
TextAlignment="Center"
FontSize="26.667"
HorizontalAlignment="Right" />
<Ellipse x:Name="LED1"
Fill="LightGray"
Stroke="White"
Width="25"
Height="25"
Margin="10,-40,10,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
RenderTransformOrigin="3.524,-1.209"/>
</StackPanel>
【问题讨论】:
-
旧的winforms确实有这些问题,你用完全相同的方式解决问题——通过在UI线程上运行setter。您只需要在主窗体上使用 WPF 调度程序而不是 BeginInvoke 方法。您要么必须这样做,要么使用 WPF 数据绑定。更新 ViewModel 并触发“Property Changed”事件将导致控件刷新其绑定。
-
我不想使用调度程序。并且 begininvoke 不是 UWP 中调度程序的成员或方法。
-
是的,我并不清楚:Dispatcher 与 WPF 一起使用就像 BeginInvoke 与 Winforms 一起使用
-
在 winforms 中使用线程是一种选择。在 UWP 中不是一个选项。
标签: vb.net uwp windows-10-iot-core