DispatcherHelper для потока - PullRequest
       0

DispatcherHelper для потока

0 голосов
/ 26 сентября 2011

У меня есть приложение, которое использует 1 главное окно и, в свою очередь, имеет 5 пользовательских элементов управления, которые создаются с помощью элемента управления ленты.

На одном из пользовательских элементов управления я запускаю поток:

if (AmtMembersWithEmail > 0)
{
    DispatcherHelper.UIDispatcher.Invoke(new Action(() =>
    {
        max = 100;
        Messenger.Default.Send<ShowProgressWindowMessage>(
                              new ShowProgressWindowMessage(this));
        Progress = 0;
        Thread.Sleep(1000);                               
    }));

Таким образом, этот поток запускается и сообщает о ходе выполнения обратно в главное окно, в течение этого времени, поскольку поток исполняется, пользователь не может получить доступ к элементам управления или сделать что-либо еще в приложении, при чтении в диспетчере это нормальнопоскольку он должен использовать единый UIThread, который позволяет пользователю взаимодействовать с элементами управления в пользовательском интерфейсе.(Между прочим, используя Galasoft MVVM light!)

В окне, отображающем сообщение о ходе выполнения, есть команда, которая связывается с командой relay в моей модели представления: Ниже приведено окно извлечения из прогресса XAML:

<tk:LoadingAnimation Grid.Row="0" DataContext="{Binding}"/>        
<ContentControl Visibility="{Binding CanBeAborted, 
                Converter={StaticResource VisibilityConverter}}" >
    <Hyperlink Command="{Binding AbortCommand}">cancel</Hyperlink>
</ContentControl>

Есть ли способ использовать диспетчер, чтобы позволить потоку работать в фоновом режиме?или пользователю просто нужно дождаться завершения операции?

Чтобы добавить, работа, которую фактически выполняет поток, - это зацикливание данных клиента, создание вложений (счетов-фактур) и создание объекта электронной почты для каждого клиента перед окончательным выполнением циклаэта новая коллекция электронной почты и отправка каждого письма индивидуально клиенту ...

Любая помощь будет принята с благодарностью ....

1 Ответ

1 голос
/ 27 сентября 2011

Мне не совсем ясно, есть ли у вас логика обработки в пользовательском элементе управления (т. Е. В коде сзади) или в вашей модели представления.Если это в вашей ViewModel, то я думаю, что вы на правильном пути.

Вместо использования диспетчера, я предлагаю вращать BackgroundWorker:

    public void DoWork()
    {
        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += (sender, e) =>
        {
            //Processing Logic here
        };
        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Work_Completed);
        worker.RunWorkerAsync();
    }

    void Work_Completed(object sender, RunWorkerCompletedEventArgs e)
    {

    }

Это не будет работать наПользовательский интерфейс потока, поэтому ваш пользовательский контроль должен быть отзывчивым.Кроме того, как будет предложено, НЕ ПРЕКРАЩАЙТЕ НИТИ.Ваша логика прерывания должна изящно выходить из цикла внутри вашей логики обработки, очищая используемые им ресурсы и выполняя любую отмененную работу, которую вам нужно сделать.

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