Silverlightスレッドを越える使用についての詳細を説明します。
<Button x:Name=“btnThread 1”Click=“btnThread 1_”Click">Thread 1
バックグラウンドコードは:
private void btnThread1_Click(object sender, RoutedEventArgs e)
{
new Thread(() =>
{
MessageBox.Show("Hello World");
}).Start();
}
プログラムを実行すると、ボタンを押すと次の異常が発生します。この問題の原因は簡単です。スレッドを使って別のスレッドを呼び出す方法はこの異常を解決する方法が簡単です。
1:DependencyObject.Dispactch.BeginnInvokeを使用する方法:
private void btnThread1_Click(object sender, RoutedEventArgs e)
{
new Thread(() =>
{
this.Dispatcher.BeginInvoke(() =>
{
MessageBox.Show("Hello World");
});
}).Start();
}
:Synconization Contectオブジェクト
private void btnThread1_Click(object sender, RoutedEventArgs e)
{
SynchronizationContext context = SynchronizationContext.Current;
new Thread(() =>
{
context.Post((state) =>
{
MessageBox.Show("Hello World");
}, null);
}).Start();
}
を使用するが、これらの両方には一つの欠陥があり、複数のスレッドがあると仮定すると、ここにcontextが保存されているが、contextはUIスレッドのSynchnitextではない。したがって、第3の案を提案しました。1:静的なタイプのUICSynconization Contectを新規作成し、コードは以下の通りです。
private void btnThread1_Click(object sender, RoutedEventArgs e)
{
new Thread(() =>
{
SynchronizationContext context = SynchronizationContext.Current;
new Thread(() =>
{
context.Post((state) =>
{
MessageBox.Show("Hello World");
}, null);
}).Start();
}).Start();
}
は、App.Xaml.csコードの構造関数を変更し、Appを作成する時に
/// <summary>
/// UI SynchronizationContext
/// </summary>
public static class UISynchronizationContext
{
public static SynchronizationContext Context { get; set; }
}
を設定して使用する時に必要なのは、
UISynchronizationContext.Context = SynchronizationContext.Current;
public App()
{
this.Startup += this.Application_Startup;
this.Exit += this.Application_Exit;
this.UnhandledException += this.Application_UnhandledException;
// UI
UISynchronizationContext.Context = SynchronizationContext.Current;
InitializeComponent();
}
実はSilverlightはすでに類似の機能のクラスを提供しています。これはSystem.Windows.Deploymentです。上のコードを完全に修正できます。
private void btnThread1_Click(object sender, RoutedEventArgs e)
{
new Thread(() =>
{
new Thread(() =>
{
UISynchronizationContext.Context.Post((state) =>
{
MessageBox.Show("Hello World");
}, null);
}).Start();
}).Start();
}
です。