私もBackgroundWorkerのコンセプトを試してみましたアニメーションの読み込みはここで機能していますが、ユーザーコントロールの読み込みが許可されておらず、エラーが発生しています。
これは仕様によるもので、STA ではないため、バックグラウンド スレッドで UI 側に触れることはできません。代わりに、進行状況インジケーターをスレッドが変更できるプロパティにバインドすると、進行状況インジケーターは INotifyPropertyChanged イベントを介して更新を取得します。
たとえば、 にProgressBar
バインドされている場合ProgressPercentage
、または不確定なビジー インジケータが にバインドされている場合IsBusy
:
でXAML
:
<ProgressBar x:Name="StatusBar"
Maximum="1" Value="{Binding ProgressPercentage}" />
でCode
:
using (var backgroundWorker = new BackgroundWorker())
{
backgroundWorker.DoWork += (s, ex) =>
{
IsBusy = true;
StatusText = "Pretending to do something...";
for (int i = 0; i < 100; i++)
{
ProgressPercentage = (i + 1)/100.0D;
Thread.Sleep(100);
}
};
backgroundWorker.RunWorkerCompleted += (s, ex) =>
{
IsBusy = false;
StatusText = "Export Complete.";
};
backgroundWorker.RunWorkerAsync();
}
バックグラウンド スレッドが作業を行い、待機中に UI スレッドがブロックされることはなく、進行状況インジケーターが更新されます。