2017-10-30 5 views
-1

私はサーバーからXMLデータを呼び出すコード部分を持っています。場合によっては、ネットワークまたはサーバー自体にエラーがあります。だから私はいくつかのエラー処理が必要です。そのために 私はAwesomeFonts.WPFをインストールし、スピニングアイコンの読み込みのアニメーションを表示する必要があり、単純な再びUIスレッドとタイマー

<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> 

を作成しました。今、私はWPFの派遣の問題を知っている今

ErrorPanel.Visibility = Visibility.Visible; 
mainPznItem.SubPzns = Communication.GetProductList(tempPznList); 
ErrorPanel.Visibility = Visibility.Hidden; 

のようなものをやってみたかったし、この1には、すでにこの

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

のようなこの

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

か何かのようなものを試してみました実際にパネルが表示されますが、アニメーションは停止しました。
そしてタイマーを稼働させて、サーバーのタイムアウトを短縮できるようにしたかったのです。
1.アニメーションを表示する
2.開始タイマー
3.サーバ
を呼び出します。4. 10に戻します。
5.答えが10になるまで、答えが得られなかったら、それ以外は表示されます。結果
6.待機中のアニメーションを非表示にします。

誰かにこれを達成するためのアイデアはありますか?

+2

好ましくは非同期Webリクエスト(HttpClient)、Task.Run()を使用して2番目の選択を使用して、非同期をGetProductList()にします。 –

答えて

2

バックグラウンドスレッドでGetProductListメソッドを実行する必要があります。

これは、UIスレッドが入力イベントを処理して同時にメソッドを実行できないため、重要な部分です。

また、タイマーを開始することもできます。

DispatcherTimer _timer; 
bool cancelled; 

async void Click() 
{ 
    if (_timer != null) 
    { 
     _timer.Stop(); 
     _timer.Dispose(); 
    } 

    ErrorPanel.Visibility = Visibility.Visible; 

    _timer = new DispatcherTimer(); 
    _timer.Interval = TimeSpan.FromSeconds(10); 
    _timer.Tick += _timer_Tick; 
    _timer.Start(); 

    var products = await Task.Run(() => Communication.GetProductList(tempPznList)); 
    _timer.Stop(); 
    if (!cancelled) 
    { 
     mainPznItem.SubPzns = products; 
     ErrorPanel.Visibility = Visibility.Hidden; 
    } 
} 

private void _timer_Tick(object sender, EventArgs e) 
{ 
    MessageBox.Show("error..."); 

    _timer.Tick -= _timer_Tick; 
    _timer.Stop(); 
    cancelled = true; 
    ErrorPanel.Visibility = Visibility.Hidden; 
} 
+0

はい、GetProductList()についてわからないからです。 CancellationTokenを取ることができれば、Timerの全体を落とすことができました。 Task.Run()も停止ギャップです。 –

+0

解決策は本当にうまくいった。私はこの全体の仕事でもう一度見なければならないことを待っている...今までそれを完全に理解していない。 –

関連する問題