完成后再次调用简单方法

时间:2011-09-15 22:55:11

标签: c# performance

背景

我有一个方法可以进行一些处理,我希望一遍又一遍地调用它。该方法可能需要50-200毫秒才能完成。

目前我有一个System.Timers.Timer,每隔250毫秒就会调用该方法。我觉得我可以通过让方法在完成后“触发”自己来提高效率。

注意:

  • 表现是关键。
  • 不应同时调用其中两种方法,也不应重叠。

我想避免简单地使用调用该方法的while循环。它应该使用事件异步调用自身吗?

问题:

如何在方法完成后让方法“触发”?

4 个答案:

答案 0 :(得分:3)

您可以在单独的执行线程中执行while循环,只要您采取必要的多线程预防措施,例如锁,条件变量,等待句柄等。

  • C#的Task Parallel Library可能适合这项工作。但正如里德所说,请务必使用LongRunning创建选项。 Reed here发布了这个方法的一个例子。
  • 或直接使用Thread对象。 SLaks发布了此方法的示例here

如果您正在使用WinForms应用程序,则可能需要考虑使用BackgroundWorker

答案 1 :(得分:1)

创建一个新的线程,在while循环中连续调用您的方法。

void DoBackgroundPolling() {
    while(true) {
        try {
            YourMethod();
        } catch(Exception ex) {
            log error
        }
    }
}

new Thread(DoBackgroundPolling).Start()

如果您希望能够控制轮询,可以检查该方法中的布尔字段。

答案 2 :(得分:1)

public delegate void MyDelegate(void);

void MyMethod()
{
  do stuff;
  this.Dispatcher.BeginInvoke(new MyDelegate(MyMethod), null);
}

答案 3 :(得分:1)

使用TPL可以相当干净地处理。在主线程中,您可以通过以下方式在后台启动此任务:

CancellationTokenSource cancel = new CancellationTokenSource();

Task.Factory
      .StartNew(() => PollHardware(cancel.Token), TaskCreationOptions.LongRunning)
      .ContinueWith(t =>
        {
            if (t.IsFaulted)
            {
                var aggException = t.Exception; // Keep task from pulling down AppDomain
                // Log/handle/etc
                LogException(aggException.InnerException);
            }
        });

然后,您只需要一种处理循环的方法:

void PollHardware(CancellationToken token)
{
     while(true)
     {           
         token.ThrowIfCancellationRequested();
         YourMethod();
     }
} 

当您希望停止轮询时,您只需拨打:cancel.Cancel()