@yone64
Wpfと非同期
 Controlに対し、非同期にプロパティーへのアクセス
やオブジェクトの生成を行うと例外が発生する
Wpfと非同期
 TaskSchedulerで、同期コンテキストを指定する。
var t = Task.Factory.StartNew(() =>
{
var s = textBox1.Text;
},
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.FromCurrentSynchronizationContext());
 Dispatcherを使い実行する。
◦ Invoke, BeginInvoke, InvokeAsyncなど
var t = Task.Run(() =>
{
textBox1.Dispatcher.Invoke(() =>
{
var s = textBox1.Text;
});
});
 優先度付キュー
◦ 優先度が高いものから実行されていく
 DispatcherPriority
◦ Send
◦ Normal
◦ DataBind
◦ Render
◦ Loaded
◦ Input
◦ Background
◦ ContextIdle
◦ ApplicationIdle
◦ SystemIdle
◦ Inactive
◦ Invalid
Send
Normal
DataBind
Render
① ②
③
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");
 非同期処理とはいえ、UIスレッドで処理を行うので、
描画は固まります。
 バックグランドスレッドでできることは、極力バックグラ
ウンドスレッドでやりましょう。
 バックグラウンドスレッドでの処理待ち後に、実行する
ために。
 Frameworkの処理を先に実行させるために。
Wpfと非同期
DependencyObject
DispatcherObject
Freezable Visual
UIElement ContainerVisual
FrameworkElement
Control
 プロパティーへのアクセス
◦ Freezableのサブクラスは、Freezeすることで別スレッドから
もアクセス可能になる
 オブジェクトの生成
◦ 生成ができないのは、FrameworkElementのサブクラス
◦ FrameworkElementのサブクラスでも、ThreadをSTAにす
れば生成可能
 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;
});
});
 メッセージプールを複数作成する。
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();
Wpfと非同期
 BingはそもそもUIスレッドで処理される。
◦ Backgroundからさわっても大丈夫
<TextBox Text="{Binding Text}" Height="23" Width="120" />
Task.Run(() =>
{
// エラーにならない
_vm.Text = DateTime.Now.ToString();
});
 Binding経由でもCollection経由の場合は、非同期
アクセスすると例外が発生する
 .Net4.5の場合
◦ BindingOperations.EnableCollectionSynchronization
BindingOperations
.EnableCollectionSynchronization(Items, new object());
 非同期といえば、Rxだよねって貴方に
 「ReactivePropertyで流れるようなWPF開発を!」
by xin9le
 メッセージループをアプリケーション内で複数作ってみ
る - 亀岡的プログラマ日記
◦ http://posaune.hatenablog.com/entry/2013/05/21
/010735
 ReactiveProperty
◦ http://reactiveproperty.codeplex.com/

More Related Content

PPTX
Msを16倍出し抜くwpf開発2回目
PPTX
Msを16倍出し抜くwpf開発1回目
PDF
未来(あす)Xamlの1msに泣かないために
PDF
WPF開発での陥りやすい罠
PDF
論理回路シミュレータ Logisim の使い方
PPTX
C#/WPFで作るデスクトップマスコット入門
PDF
C++の話(本当にあった怖い話)
PDF
カリギュラオーバードーズにおけるUE4へのデータ移植の手引き
Msを16倍出し抜くwpf開発2回目
Msを16倍出し抜くwpf開発1回目
未来(あす)Xamlの1msに泣かないために
WPF開発での陥りやすい罠
論理回路シミュレータ Logisim の使い方
C#/WPFで作るデスクトップマスコット入門
C++の話(本当にあった怖い話)
カリギュラオーバードーズにおけるUE4へのデータ移植の手引き

What's hot (20)

PPTX
JSでファミコンエミュレータを作った時の話
PDF
社内ドキュメント検索システム構築のノウハウ
PDF
ドキュメントシステムはこれを使え2015年版
PPTX
20150530 めとべや東京 Reactive Property + Livetで作るWPFアプリ
PDF
Rpn and forth 超入門
PPTX
C#で速度を極めるいろは
PDF
ドメイン駆動設計サンプルコードの徹底解説
PPTX
Webアプリって奥が深いんです
PPTX
ログの書き方がチームの生産性を爆上げする話
PDF
FridaによるAndroidアプリの動的解析とフッキングの基礎
PDF
UE4のシーケンサーをもっともっと使いこなそう!最新情報・Tipsをご紹介!
PDF
最強オブジェクト指向言語 JavaScript 再入門!
PDF
ONIC2017 プログラマブル・データプレーン時代に向けた ネットワーク・オペレーションスタック
PDF
ゲームアプリの数学@GREE GameDevelopers' Meetup
PDF
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
PDF
.NET Core 3.0時代のメモリ管理
PDF
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
PDF
JDK 16 で導入された JEP 396 にご注意!! (JJUG CCC 2021 Spring)
PPTX
高度に最適化された移植可能なメモリマネージャ
PPTX
基板から回路図を起こしてみよう
JSでファミコンエミュレータを作った時の話
社内ドキュメント検索システム構築のノウハウ
ドキュメントシステムはこれを使え2015年版
20150530 めとべや東京 Reactive Property + Livetで作るWPFアプリ
Rpn and forth 超入門
C#で速度を極めるいろは
ドメイン駆動設計サンプルコードの徹底解説
Webアプリって奥が深いんです
ログの書き方がチームの生産性を爆上げする話
FridaによるAndroidアプリの動的解析とフッキングの基礎
UE4のシーケンサーをもっともっと使いこなそう!最新情報・Tipsをご紹介!
最強オブジェクト指向言語 JavaScript 再入門!
ONIC2017 プログラマブル・データプレーン時代に向けた ネットワーク・オペレーションスタック
ゲームアプリの数学@GREE GameDevelopers' Meetup
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
.NET Core 3.0時代のメモリ管理
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
JDK 16 で導入された JEP 396 にご注意!! (JJUG CCC 2021 Spring)
高度に最適化された移植可能なメモリマネージャ
基板から回路図を起こしてみよう
Ad

Similar to Wpfと非同期 (20)

PPTX
An other world awaits you
PDF
C#次世代非同期処理概観 - Task vs Reactive Extensions
PDF
いまさら恥ずかしくてAsyncをawaitした
PDF
Windows ストア アプリでスレッド間排他処理
PDF
async/awaitダークサイド is 何
PDF
パターンでわかる! .NET Coreの非同期処理
PDF
Windows 8時代のUXを支える非同期プログラミング
PDF
これからの「async/await」の話をしよう
PPTX
async/await のしくみ
PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
PDF
Async History in .NET
PDF
async/await不要論
PPTX
Lt 111119
PDF
Reactive Extensionsで非同期処理を簡単に
PPTX
非同期処理の基礎
PDF
C#アプリの高速化web
PPTX
わんくま名古屋#28(20130824) c#で、ライフゲームを高速化してみるよ
PPTX
Orange Cube 自社フレームワーク 2015/3
PDF
Async design with Unity3D
PPTX
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
An other world awaits you
C#次世代非同期処理概観 - Task vs Reactive Extensions
いまさら恥ずかしくてAsyncをawaitした
Windows ストア アプリでスレッド間排他処理
async/awaitダークサイド is 何
パターンでわかる! .NET Coreの非同期処理
Windows 8時代のUXを支える非同期プログラミング
これからの「async/await」の話をしよう
async/await のしくみ
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Async History in .NET
async/await不要論
Lt 111119
Reactive Extensionsで非同期処理を簡単に
非同期処理の基礎
C#アプリの高速化web
わんくま名古屋#28(20130824) c#で、ライフゲームを高速化してみるよ
Orange Cube 自社フレームワーク 2015/3
Async design with Unity3D
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
Ad

More from yone64 (7)

PPTX
C sharp6
PPTX
XAML & XAML
PPTX
Reactive extensions
PPTX
もう一つのLINQ ~ Queryable入門
PPTX
超Linq入門 実践編
PPTX
超LINQ入門
PPTX
とあるアプリの設計進化
C sharp6
XAML & XAML
Reactive extensions
もう一つのLINQ ~ Queryable入門
超Linq入門 実践編
超LINQ入門
とあるアプリの設計進化

Wpfと非同期