我有一个进程在完成时调用事件。
void DoProcess()
{
...
...
// Call finished event
OnFinished();
}
我想多次运行此过程。
我的第一个想法是每次调用'完成'事件时都要回忆这个过程。
void obj_Finished()
{
DoProcess();
}
这是否意味着堆栈会变得越来越大?因为'完成'事件会自称为'完成'事件等...
我可以以某种方式使用其他线程来避免这个问题吗?
我可以使用更好的设计模式吗?
我希望代码非常有效,但是,我喜欢使用事件:)
答案 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();
}