狠狠撸

狠狠撸Share a Scribd company logo
@yone64
奥辫蹿と非同期
? Controlに対し、非同期にプロパティーへのアクセス
やオブジェクトの生成を行うと例外が発生する
奥辫蹿と非同期
? 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の処理を先に実行させるために。
奥辫蹿と非同期
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();
奥辫蹿と非同期
? 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

奥辫蹿と非同期