O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.
@yone64
 Controlに対し、非同期にプロパティーへのアクセス
やオブジェクトの生成を行うと例外が発生する
 TaskSchedulerで、同期コンテキストを指定する。
var t = Task.Factory.StartNew(() =>
{
var s = textBox1.Text;
},
CancellationToken.None,
Ta...
 Dispatcherを使い実行する。
◦ Invoke, BeginInvoke, InvokeAsyncなど
var t = Task.Run(() =>
{
textBox1.Dispatcher.Invoke(() =>
{
var ...
 優先度付キュー
◦ 優先度が高いものから実行されていく
 DispatcherPriority
◦ Send
◦ Normal
◦ DataBind
◦ Render
◦ Loaded
◦ Input
◦ Background
◦ Con...
var dispatcher = Application.Current.Dispatcher;
dispatcher.BeginInvoke(new Action(() => Console.WriteLine("No1")),
Dispat...
 非同期処理とはいえ、UIスレッドで処理を行うので、
描画は固まります。
 バックグランドスレッドでできることは、極力バックグラ
ウンドスレッドでやりましょう。
 バックグラウンドスレッドでの処理待ち後に、実行する
ために。
 Frameworkの処理を先に実行させるために。
DependencyObject
DispatcherObject
Freezable Visual
UIElement ContainerVisual
FrameworkElement
Control
 プロパティーへのアクセス
◦ Freezableのサブクラスは、Freezeすることで別スレッドから
もアクセス可能になる
 オブジェクトの生成
◦ 生成ができないのは、FrameworkElementのサブクラス
◦ Framework...
 BitmapImageやBrushをバックグラウンドで作成し、
利用する。
Task.Run(() =>
{
var sr = new MemoryStream(
new WebClient().DownloadData(new Uri("...
 メッセージプールを複数作成する。
var thread = new Thread(() =>
{
var dispacherFrame = new DispatcherFrame(true);
var w = new Window {Wid...
 BingはそもそもUIスレッドで処理される。
◦ Backgroundからさわっても大丈夫
<TextBox Text="{Binding Text}" Height="23" Width="120" />
Task.Run(() =>
{...
 Binding経由でもCollection経由の場合は、非同期
アクセスすると例外が発生する
 .Net4.5の場合
◦ BindingOperations.EnableCollectionSynchronization
BindingO...
 非同期といえば、Rxだよねって貴方に
 「ReactivePropertyで流れるようなWPF開発を!」
by xin9le
 メッセージループをアプリケーション内で複数作ってみ
る - 亀岡的プログラマ日記
◦ http://posaune.hatenablog.com/entry/2013/05/21
/010735
 ReactiveProperty
◦ h...
Wpfと非同期
Wpfと非同期
Wpfと非同期
Wpfと非同期
Próximos SlideShares
Carregando em…5
×

Wpfと非同期

7.277 visualizações

Publicada em

Publicada em: Tecnologia
  • Seja o primeiro a comentar

Wpfと非同期

  1. 1. @yone64
  2. 2.  Controlに対し、非同期にプロパティーへのアクセス やオブジェクトの生成を行うと例外が発生する
  3. 3.  TaskSchedulerで、同期コンテキストを指定する。 var t = Task.Factory.StartNew(() => { var s = textBox1.Text; }, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
  4. 4.  Dispatcherを使い実行する。 ◦ Invoke, BeginInvoke, InvokeAsyncなど var t = Task.Run(() => { textBox1.Dispatcher.Invoke(() => { var s = textBox1.Text; }); });
  5. 5.  優先度付キュー ◦ 優先度が高いものから実行されていく  DispatcherPriority ◦ Send ◦ Normal ◦ DataBind ◦ Render ◦ Loaded ◦ Input ◦ Background ◦ ContextIdle ◦ ApplicationIdle ◦ SystemIdle ◦ Inactive ◦ Invalid Send Normal DataBind Render ① ② ③
  6. 6. var dispatcher = Application.Current.Dispatcher; dispatcher.BeginInvoke(new Action(() => Console.WriteLine("No1")), DispatcherPriority.Normal); Console.WriteLine("No2"); dispatcher.BeginInvoke(new Action(() => Console.WriteLine("No3")), DispatcherPriority.Render); dispatcher.BeginInvoke(new Action(() => Console.WriteLine("No4")), DispatcherPriority.Send); dispatcher.Invoke(new Action(() => Console.WriteLine("No5")), DispatcherPriority.DataBind); Console.WriteLine("No6");
  7. 7.  非同期処理とはいえ、UIスレッドで処理を行うので、 描画は固まります。  バックグランドスレッドでできることは、極力バックグラ ウンドスレッドでやりましょう。
  8. 8.  バックグラウンドスレッドでの処理待ち後に、実行する ために。  Frameworkの処理を先に実行させるために。
  9. 9. DependencyObject DispatcherObject Freezable Visual UIElement ContainerVisual FrameworkElement Control
  10. 10.  プロパティーへのアクセス ◦ Freezableのサブクラスは、Freezeすることで別スレッドから もアクセス可能になる  オブジェクトの生成 ◦ 生成ができないのは、FrameworkElementのサブクラス ◦ FrameworkElementのサブクラスでも、ThreadをSTAにす れば生成可能
  11. 11.  BitmapImageやBrushをバックグラウンドで作成し、 利用する。 Task.Run(() => { var sr = new MemoryStream( new WebClient().DownloadData(new Uri("http://xx/img/1.jpg"))); var bi = new BitmapImage(); bi.BeginInit(); bi.CacheOption = BitmapCacheOption.OnLoad; bi.StreamSource = sr; bi.EndInit(); bi.Freeze(); Application.Current.Dispatcher.Invoke(() => { image.Source = bi; }); });
  12. 12.  メッセージプールを複数作成する。 var thread = new Thread(() => { var dispacherFrame = new DispatcherFrame(true); var w = new Window {Width = 800, Height = 600}; var p = new WrapPanel {Orientation = Orientation.Horizontal}; w.Content = p; for (int i = 0; i < 20000; i++) { p.Children.Add(new Button { Height = 30, Width = 120, Content = "ボタン" + i, }); } w.Closed += (o, args) => dispacherFrame.Continue = false; w.Show(); Dispatcher.PushFrame(dispacherFrame); }); thread.SetApartmentState(ApartmentState.STA); thread.Start();
  13. 13.  BingはそもそもUIスレッドで処理される。 ◦ Backgroundからさわっても大丈夫 <TextBox Text="{Binding Text}" Height="23" Width="120" /> Task.Run(() => { // エラーにならない _vm.Text = DateTime.Now.ToString(); });
  14. 14.  Binding経由でもCollection経由の場合は、非同期 アクセスすると例外が発生する  .Net4.5の場合 ◦ BindingOperations.EnableCollectionSynchronization BindingOperations .EnableCollectionSynchronization(Items, new object());
  15. 15.  非同期といえば、Rxだよねって貴方に  「ReactivePropertyで流れるようなWPF開発を!」 by xin9le
  16. 16.  メッセージループをアプリケーション内で複数作ってみ る - 亀岡的プログラマ日記 ◦ http://posaune.hatenablog.com/entry/2013/05/21 /010735  ReactiveProperty ◦ http://reactiveproperty.codeplex.com/

×