Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

BagroundWorker: как поставить на паузу, а потом снять с паузы?

71K
15 мая 2011 года
Антон Махорт
2 / / 15.05.2011
Всем привет. Опишу свою задачу:
1. В отдельном потоке крутится бесконечный цикл, который каждые полсекунды прибавляется день к дефолтному значению переменной d типа DateTime. - реализовано в методе DoWork от BackgroundWorker. Это все что делает DoWork.

2. В зависимости от приобретенного значения d выполняются проверки в методе ProgressChanged. Так же в этом методе определяется показывать то или иное окно или нет. В каждый вызов ProgressChanged может быть показано только одно окно или не показано ниодного.

Прим. Окна представляют собой button'ы с кастомным стилем. Поумолчанию у таких окон Visibility = Collapsed.

Вопрос: Как перестать выполнять бесконечный цикл в DoWork, в момент когда окно(button) - отображается (Visibility = Visible) и возобновлять цикл, когда это окно закрываешь?

Код:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    for (; ; )
    {
         System.Threading.Thread.Sleep(700);
         d = d.AddDays(1);
         backgroundWorker1.ReportProgress(0);
    }
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    ....
    EventVizualization(events.GetEvent());
    ....
}
private void EventVizualization(ListOfEvents loe)
{
      switch (loe)
      {
            case ListOfEvents.123:
                    btnGoTo123.Visibility = Visibility.Visible;
                    break;
      .....
      }
}

<XAML>
<Button Name="btnGoTo123" Style="{StaticResource eventWindow}" Visibility="Collapsed" Click="btnGoTo123_Click">
            <Grid>
                <Grid.Background>
                    <ImageBrush ImageSource="img/***.png"/>
                </Grid.Background>
            </Grid>
        </Button>
</XAML>


Project's type - Silverlight: Widows Phone Application
71K
16 мая 2011 года
Антон Махорт
2 / / 15.05.2011
В идеале конечно, нечто подобное:

Код:
private void EventVizualization(ListOfEvents loe)
{
      switch (loe)
      {
            case ListOfEvents.123:
                    btnGoTo123.Visibility = Visibility.Visible;
                    backgroundWorker1.Pause();
                    break;
      .....
      }
}

 private void btnGoTo123_Click(object sender, RoutedEventArgs e)
 {
       btnGoTo123.Visibility = Visibility.Collapsed;
       backgroundWorker1.Play();
 }
5
16 мая 2011 года
hardcase
4.5K / / 09.08.2005
Зачем использовать BackgoundWorker в бесконечном цикле? Почему бы для этого (выполнение кода каждые X секунд) не использовать таймер Threading.Timer?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог