如何循环结束事件的进程? (C#的.NET)

时间:2010-01-21 18:56:09

标签: c# events loops stack

我有一个进程在完成时调用事件。

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

我想多次运行此过程。

我的第一个想法是每次调用'完成'事件时都要回忆这个过程。

void obj_Finished()
{
    DoProcess();        
}

这是否意味着堆栈会变得越来越大?因为'完成'事件会自称为'完成'事件等...

我可以以某种方式使用其他线程来避免这个问题吗?

我可以使用更好的设计模式吗?

我希望代码非常有效,但是,我喜欢使用事件:)

3 个答案:

答案 0 :(得分:2)

假设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不触及UI,它在另一个线程上运行。 ProgressChanged在主线程上运行。

答案 1 :(得分:0)

是的,这会导致无限循环,除非你将逻辑放在原位导致最终的DoProcess()不引发事件或在引发事件之前退出进程。

除非有充分的理由在这里处理事件,否则我只是将DoProcess()调用放在迭代循环中。

除非你真的需要处理事件,否则我会创建一个处理Finished事件的控制器对象,并根据某些条件执行另一个DoProcess()或简单地引发一个让全世界都知道的事件所有必须执行的DoProcess()东西都已完成。

答案 2 :(得分:0)

我不清楚DoProcess和事件处理程序正在做什么,但假设没有什么复杂的,我没有看到为什么不这么做的原因:

while (condition)
{
  DoProcess();
}