2017-02-12 11 views
0

私はwpfレガシーアプリケーションで動作するはずです(そして、デスクトップアプリケーションは私のために新しい獣です)。 私はconsummingタスクは、UIスレッド上で起動できないことを読みました:私は、ビューの背後にあるコードでは、この次のコードを見つける:wpf - xamlコードビハインドからデータベースを呼び出すのは危険ですか?

bool isSearching = true; 
try 
{ 
    Task<ProductSearchResult>.Factory       
    .StartNew(() => DBCatalogService.Search(search.Criteria, search.CriteriaPage, search.CriteriaResultByPage)  
    .ContinueWith(res => LoadResult(res, search.Criteria, search.CriteriaPage, search.CriteriaResultByPage), 
      TaskScheduler.FromCurrentSynchronizationContext())       
    .ContinueWith(s => isSearching = false); 
} 
catch 
{ 
... 
} 

私はそれがすべての問題を引き起こすことはありません疑問に思って。 私は、ビューコードの背後から直接データベースを呼び出すのが奇妙だと知っていますが、私はちょうどそれがこのようなUIスレッドを凍結するかどうかを知りたいです。 この問題についてアドバイスをいただきありがとうございます。

+0

あなたはどのネットフレームワークをターゲットにしていますか?なぜなら、継続性のある伝統的なタスクの代わりに非同期待ち時間を使用することが考えられるからです。 – taquion

+0

アプリケーションがフレームワーク4.5.1をターゲットにしています。ここで非同期を使用すると違いが生じるのでしょうか? – Dypso

答えて

1

質問:私が提供したサンプルコードはUIスレッドをブロックし、有害であるとみなされる必要がありますか?

それはタスク並列ライブラリ(TPL)を使用してバックグラウンドスレッド上で呼び出されているためDBCatalogService.Searchメソッドへの呼び出しはないは、UIスレッドをブロックします。

ただし、Searchメソッドを呼び出すタスクが完了すると、LoadResultメソッドの呼び出しはUIスレッドで実行されます。

これはうまくいきますが、この方法では検索結果に基づいて一部のUI要素の一部のプロパティが設定され、UIスレッドでこれを行う必要があるためです。これは、WPFコントロールにスレッド親和性があるためです。つまり、コントロールが最初に作成されたスレッドでのみアクセスできるということです。

提供したサンプルコードは、LoadResultが奇妙で長時間実行される操作を実行しないと仮定すると、UIの応答性に関して「有害」とみなしてはなりません。

+0

ありがとうございました。 – Dypso

0

同期DB要求などの長時間実行される操作でUIスレッド(ディスパッチャスレッド)をブロックすると、スレッドがブロック解除されるまでアプリケーションは応答しなくなります。

あなたはいずれかの方法でこれを避けることができます。

  • が操作非ブロック/非同期
  • を作る別のスレッド
  • 上のブロッキング/同期動作を行う上記

の両方async/awaitを使用すると、コードは同期フォームとよく似ていますが、非同期の動作になります。それはあなたが質問で与えるコードサンプルよりはるかに明確にすべきです。ただし、非同期形式の検索が必要です。

他のスレッドを使用する場合は、UIプロパティを更新する必要がある場合は、UIスレッドに戻すようにしてください。

+0

こんにちは、私が前に言ったように、私はこれを知っています:これは効果的に私がウェブ上で読んだことです。私の質問は:私が提供したサンプルコードは、UIスレッドをブロックし、harmfullかどうかを検討する必要がありますか?とにかく助けてくれてありがとう。 – Dypso

関連する問題