Окно долгосрочного прогресса операции - PullRequest
1 голос
/ 25 сентября 2010

в приложении WPF Я загружаю список бизнес-объектов с помощью WCF в список.
Я хочу загрузить его в другой поток и отобразить окно индикатора выполнения.

Но как?Мне нужно вызвать службу WCF во втором потоке и вернуть ее возвращаемое значение в первый (UI) поток.И это точка, которую я не знаю.Как вернуть?Или какой должен быть правильный рабочий процесс вызова данных в фоновом режиме и отображения прогресса?

Теперь я:
- показать окно прогресса
- создать новый поток и вызвать службу WCF
- вернуть значения <- я не знаю <br>- закрыть окно

Но - этот рабочий процесс прав?

Я не хочу использовать фонового работника, потому что я могу вызватьмного разных сервисов WCF, не только один, который я мог бы записать в метод DoWork.

У меня есть класс WCFClient, в котором я вызываю все нужные мне сервисы.Вот один из методов (все методы одинаковы, только вызовы разных служб):

public class Client
{
    public List<BusinessDto> GetBusinesses(int userID)
    {
        OnConnecting();

        ServiceClient client = null;
        BusinessDto[] dtos = null;
        try
        {
            client = new ServiceClient();
            dtos = client.GetBusinesses(userID);
        }
        catch
        {
            MessageBox.Show(Properties.Resources.ConnectionNotSucessful, Properties.Resources.ApplicationName, MessageBoxButton.OK, MessageBoxImage.Error);
        }
        finally
        {
            if (client != null) client.Close();

            OnClosing();

        }
        return dtos.ToList();
    }
}

Я ловлю Onconnecting и OnClosing события WCFClientи открытие и закрытие нового окна с помощью индикатора выполнения.

Но я не вызываю службы WCF в новом потоке, потому что не знаю как.

Спасибо, я пытаюсь это сделатьбезуспешно в течение двух дней.

Ответы [ 2 ]

2 голосов
/ 25 сентября 2010

Я не хочу использовать фонового работника, потому что я могу вызывать много разных сервисов WCF, а не только один, который я могу написать в метод DoWork.

Ну, во-первых, вы можетерешите, какой из многих методов DoWork вы хотите вызвать во время подготовки BackgroundWorker.Но вы также можете (и это, вероятно, более легко поддерживать) написать метод DoWork произвольной сложности.Вы можете написать метод DoWork, который принимает аргумент типа Client, и заставить его вызывать метод-член этого объекта, например.В этом методе нет абсолютно никаких ограничений.

Способ реализации окна индикатора выполнения:

  1. Реализация класса Task, который предоставляет три метода: SetUp, Execute и TearDown, а также свойство Status, представляющее собой структуру, содержащую int PercentComplete и string Message.Реализация INotifyPropertyChanged.
  2. Реализация метода protected UpdateStatus, который обновляет Status и вызывает PropertyChanged.
  3. Создание модального окна, которое реализует метод ShowDialog(Task t).В этом методе вызовите t.SetUp(), затем создайте BackgroundWorker.
  4. Обработайте t.PropertyChanged, и обработчик вызовет событие BackgroundWorker ProgressChanged.
  5. У обработчика событий BackgroundWorker ProgressChanged используйте t.Status для обновления пользовательского интерфейса,
  6. Для вызова обработчика событий BackgroundWorker * DoWork t.Execute().
  7. Имеет свой обработчик событий RunWorkerCompleted, который обрабатывает исключения (не пренебрегайте этим!) И вызывает t.TearDown().
  8. Создайте и протестируйте подклассы Task при необходимости.
  9. Всякий раз, когда вам нужно отобразить окно индикатора выполнения, создайте экземпляр соответствующего Task, установите необходимые свойства и затем вызовите ProgressBarWindow.ShowDialog(t).Это отобразит окно и блок и будет ждать, пока будет запущен фоновый процесс, обновляя пользовательский интерфейс;он вернется после вызова t.TearDown().
0 голосов
/ 25 сентября 2010

BackgroundWorker ваш друг. Он создает поток для вас, оставляя вас беспокоиться только о выполнении реальной работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...