Как правильно вызвать фоновый поток в диалоге незавершенного производства?

1

В главном окне нашего приложения откроется диалоговое окно, в котором необходимо вызвать фоновый поток. Диалоговое окно должно появиться до завершения потока:

var dialog = new WorkInProgressDialog();
dialog = ShowDialg;

Проблема в том, где/как вызвать поток в конструкторе WorkInProgressDialog? Если он вызывается в конструкторе, диалог не будет отображаться до тех пор, пока поток не будет завершен.

Также диалоговое окно должно быть автоматически закрыто после завершения потока.

  • 0
    Много вариантов - вы можете использовать Thread , BackgroundWorker или в идеале новую библиотеку задач, например Task.Factory.StartNew
  • 0
Показать ещё 1 комментарий
Теги:
multithreading
wpf

1 ответ

1
Лучший ответ

Вот пример, который, надеюсь, поможет вам. Некоторая простая разметка для WorkInProgressDialog:

<Window x:Class="WorkInProgressExample.WorkInProgressDialog"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WorkInProgressDialog" Height="100" Width="300" WindowStyle="None" 
    ResizeMode="NoResize" WindowStartupLocation="CenterScreen">
    <Border BorderThickness="3" CornerRadius="5" BorderBrush="Black" Padding="10">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"></RowDefinition>
                <RowDefinition Height="Auto"></RowDefinition>
                <RowDefinition Height="Auto"></RowDefinition>
                <RowDefinition Height="*"></RowDefinition>
            </Grid.RowDefinitions>            

            <TextBlock Grid.Row="1" Name="WorkProgressTextBlock">Work in progress...</TextBlock>
            <ProgressBar Grid.Row="2" Height="30" Name="WorkProgressBar"></ProgressBar>
        </Grid>
    </Border>
</Window>

Затем в коде позади:

private bool _closeAuthorised = false;

public WorkInProgressDialog()
{
    InitializeComponent();

    WorkProgressBar.Maximum = 10;
    WorkProgressBar.Minimum = 0;

    Task.Factory.StartNew(() =>
    {
        // Do whatever processing you need to here
        for (int i = 0; i < 10; i++)
        {
            // Any updates to the UI need to be done on the UI thread
            this.Dispatcher.Invoke((Action)(() =>
            {
                WorkProgressBar.Value = i;
            }));

            Thread.Sleep(1000);
        }

        // Set the DialogResult and hence close, also on the UI thread
        this.Dispatcher.Invoke((Action)(() =>
        {
            _closeAuthorised = true;
            this.DialogResult = true;
        }));

    });
}

protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    // If the user uses ALT+F4 to try andclose the loading dialog, this will cancel it
    if (!_closeAuthorised)
        e.Cancel = true;
    base.OnClosing(e);
}

Затем, где вы хотите его использовать:

var dialog = new WorkInProgressDialog();
bool? result = dialog.ShowDialog();
  • 0
    Большое спасибо за полезный пример. Будет ли WorkInProgressDialog закрываться только установкой DialogResult в true?
  • 0
    Нет проблем. Нет, диалоговое окно закроется также, если вы установите this.DialogResult в false. Разница в том, что откуда вы показываете диалог (последний блок кода в моем примере) bool? результат будет ложным, а не истинным. Вы можете использовать это, чтобы указать состояние ошибки, например.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню