C # список непрерывного цикла - PullRequest
0 голосов
/ 05 июля 2011

могу ли я заставить этот цикл продолжать таким образом, чтобы после последнего элемента в списке переходить к первому и так далее ...

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;
    for (int i = listBox1.Items.Count - 1; i >= 0; i--)
    {
        {
            if (worker.CancellationPending == true)
            {
                e.Cancel = true;
                break;
            }
            else
            {
                string queryhere = listBox1.Items[i].ToString();
                this.SetTextappend("" + queryhere + "\n");
                System.Threading.Thread.Sleep(500);
                worker.ReportProgress(i * 1);
            }
        }
    }
}

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

Спасибо за ответы на все вопросы

похоже, мой список шел задом наперед, поэтому я должен заменить

 for (int i = listBox1.Items.Count - 1; i >= 0; i--)

на

 for (int i=0;i<ListBox1.Items.Count;i++)

Ответы [ 4 ]

2 голосов
/ 05 июля 2011

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

Ваш цикл for может стать:

int i = 0;
for(;;)  // or while(true)
{
    if (i <= 0)
      i = listBox1.Items.Count;

    i -= 1;

    if (worker.CancellationPending)
    {
        ...
    }

}

Но я заметил, что вы читаете из ListBox внутри BGW, который не является потокобезопасным.Даже если это может работать, при изменении ListBox вы можете получить нулевые значения или исключения.Очень редко.

Редактировать

И пойти другим путем еще проще:

int i = -1;
for(;;)  // or while(true)
{
    i = (i + 1) % listBox1.Items.Count;

    if (worker.CancellationPending)
    {
        ...
    }  
}
1 голос
/ 05 июля 2011

Как то так?

BackgroundWorker worker = sender as BackgroundWorker;
bool go = true;
while(go)
{
    for (int i = listBox1.Items.Count - 1; i >= 0; i--)
    {
        {
            if (worker.CancellationPending == true)
            {
                e.Cancel = true;
                go = false;
                break;
            }
            else
            {
                string queryhere = listBox1.Items[i].ToString();
                this.SetTextappend("" + queryhere + "\n");
                System.Threading.Thread.Sleep(500);
                worker.ReportProgress(i * 1);
            }
        }
    }
}
0 голосов
/ 05 июля 2011
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {    
        BackgroundWorker worker = sender as BackgroundWorker;
        while (worker.CancellationPending != true)
        {
            for (int i = listBox1.Items.Count - 1; i >= 0; i--)
            {
                   if(worker.CancellationPending != true)
                   {
                      string queryhere = listBox1.Items[i].ToString();
                      this.SetTextappend("" + queryhere + "\n");
                      System.Threading.Thread.Sleep(500);
                      worker.ReportProgress(i * 1);
                   }
                   else
                   {
                      break;
                   } 
            }
        }
        e.Cancel = true;
    }
0 голосов
/ 05 июля 2011
int N = listbox1.Items.Count;
for (int i=N-1; !worker.CancellationPending; i = (i+N-1) % N ) 
{
   // this weird calculation i=(i+N-1)%N is because I'm not sure whether C# 
   // divides negative integers properly (so that the remainder is non-negative)
   // It could be i=(i-1)%N . 
   string queryhere = listBox1.Items[i].ToString();
   this.SetTextappend("" + queryhere + "\n");
   System.Threading.Thread.Sleep(500);
   worker.ReportProgress(i * 1); // by the way, there should be a percentage.
                                 // You better revise the progress reporting.
}
e.Cancel = true;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...