В дополнение к вышеуказанным предложениям (фоновый рабочий, диспетчер) - да, это правильные методы, чтобы получить то, что вы хотите, но позвольте мне обсудить эффект пользовательского интерфейса, который вы запросили в своем вопросе. Если вы используете шаблон MVVM, вы можете создать пользовательский интерфейс «Я занят» и привязать его к свойству IsBusy в модели представления, чтобы показать и скрыть пользовательский интерфейс. Например:
public class MyViewModel : INotifyPropertyChanged
{
// Bind to this property any UI you want to
// show/hide during long running updates
public bool IsBusy
{
get { return _isBusy; }
set
{
_isBusy = true;
OnPropertyChanged("IsBusy");
}
}
private void OnPropertyChanged(string prop)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(prop));
}
}
// Note: This is intended to be called on a background thread
private void DoLongRunningOperationOnABackgroundThread()
{
try
{
IsBusy = true;
// do your work
}
finally
{
IsBusy = false;
}
}
}
Тогда в использовании пользовательского интерфейса этой XAML (или аналогичные)
<UserControl:MyControl x:Class="MyApp.MyControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<UserControl.Resources>
<BooleanToVisibilityConverter x:Key="boolToVis"/>
</UserControl.Resources>
<Grid>
<!-- your UI code goes here -->
<!-- Below this, at higher Z-Order place a control to gray out the screen when IsBusy = true -->
<Border Background="#55000000" BorderThickness="0" Visibility="{Binding IsBusy, Converter={StaticResource boolToVis}}">
<TextBlock Text="I AM BUSY!" Font-Size="32" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="White"/>
</Border>
<Grid>
</UserControl>
Чистый эффект будет при использовании фона рабочего или ThreadPool вызвать функцию DoLongRunningOperation в вашем ViewModel, граница, определенная в Xaml, будет отображаться/скрываться при запуске/остановке операции. Вам не понадобится диспетчер для вызова здесь, поскольку WPF обрабатывает сортировку потоков для вас.
Существуют реалистичные элементы управления занятостью с анимацией whirlygig и т. Д. ... в сети, чтобы оживить интерфейс.
С уважением,
Спасибо, это было очень полезно! –