Как я могу зациклить процесс, который заканчивается событием? (C # .NET) - PullRequest
2 голосов
/ 21 января 2010

У меня есть процесс, который вызывает событие, когда оно завершено.

void DoProcess()
{
    ...
    ...
    // Call finished event
    OnFinished();
}

Я хочу запустить этот процесс много раз.

Моей первой идеей было вспоминать процесс каждый раз, когда вызывалось событие «Завершено».

void obj_Finished()
{
    DoProcess();        
}

Значит ли это, что стек будет становиться все больше и больше? поскольку событие «Завершено» будет называться само, которое будет называться событием «Завершено» и т. д. *

Могу ли я каким-либо образом использовать другой поток, чтобы избежать этой проблемы?

Есть ли лучший шаблон дизайна, который я могу использовать?

Я бы хотел, чтобы код был достаточно эффективным, однако мне нравится использовать events:)

Ответы [ 3 ]

2 голосов
/ 21 января 2010

В предположении WinForms или WPF: используйте BackgroundWorker .

Вы можете запустить DoProcess в простом цикле и вызвать Updateprogress для выполнения вашего события (синхронизировано).

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        var worker = sender as BackgroundWorker;

        while (true) // or something
        {
            DoProcess();
            worker.ReportProgress(0, null);
        }
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        OnFinished();
    }

Это предполагает, что DoProcess не касается пользовательского интерфейса, он работает в другом потоке. ProgressChanged работает в главном потоке.

0 голосов
/ 21 января 2010

Мне не ясно, что делают DoProcess и обработчик событий, но, если не считать ничего сложного, я не вижу причины, почему бы не сделать это просто так:

while (condition)
{
  DoProcess();
}
0 голосов
/ 21 января 2010

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

Если здесь нет веских причин для работы с событиями, я бы просто поместил вызовы DoProcess () в цикл итерации.

Если вы действительно НЕ ДОЛЖНЫ работать с событиями, и в этом случае я бы создал объект контроллера, который обрабатывает события Finished и на основе определенных условий либо выполняет другой DoProcess (), либо просто вызывает событие, которое сообщает всему миру что все вещи DoProcess (), которые должны были быть выполнены, выполнены.

...