再次UI线程和计时器

时间:2017-10-30 15:12:19

标签: c# wpf ui-thread

我有一个代码部分,我从服务器调用一些XML数据。有时网络或服务器本身出错。所以我需要一些错误处理。 为此,我安装了AwesomeFonts.WPF并创建了一个简单的

    <StackPanel Name="ErrorPanel" Height="200" Width="300" Visibility="Hidden" Canvas.Top="440" Canvas.Left="810" Panel.ZIndex="9999">
        <fa:ImageAwesome Icon="Spinner" Spin="True" Height="100" Width="100" />
        <TextBlock Text="data loading..." />
    </StackPanel>

这应显示旋转图标的加载动画。现在我想做一些像

这样的事情
ErrorPanel.Visibility = Visibility.Visible;
mainPznItem.SubPzns = Communication.GetProductList(tempPznList);
ErrorPanel.Visibility = Visibility.Hidden;

现在我知道了WPF的调度问题,并尝试过像这样的事情

Application.Current.Dispatcher.Invoke(() => { ErrorPanel.Visibility = Visibility.Visible; });

或类似的东西

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new 
ThreadStart(delegate
{
    ErrorPanel.Visibility = Visibility.Visible;
}));

在这个上我真的让Panel可见,但动画停止了 我想让一个计时器运行,这样我就可以缩短服务器的超时时间。我想做更多的事情:
1。显示动画
2。启动计时器
3。呼叫服务器
4。数到10
5。如果我在10之前没有得到答案,那么显示错误信息,否则显示结果
6。隐藏等待的动画。

有人知道如何实现这个目标吗?

1 个答案:

答案 0 :(得分:2)

您应该在后台线程上执行opacity: 1方法。

GetProductList

这是重要的部分,因为UI线程不能同时处理输入事件和执行你的方法。

如果您愿意,也可以启动计时器。像这样:

async void Click(object sender, RoutedEventArgs e)
{
    ErrorPanel.Visibility = Visibility.Visible;
    var products = await Task.Run(() => Communication.GetProductList(tempPznList));
    mainPznItem.SubPzns = products;
    ErrorPanel.Visibility = Visibility.Hidden;
}