背景
我有一个方法可以进行一些处理,我希望一遍又一遍地调用它。该方法可能需要50-200毫秒才能完成。
目前我有一个System.Timers.Timer
,每隔250毫秒就会调用该方法。我觉得我可以通过让方法在完成后“触发”自己来提高效率。
注意:
我想避免简单地使用调用该方法的while
循环。它应该使用事件异步调用自身吗?
问题:
如何在方法完成后让方法“触发”?
答案 0 :(得分:3)
您可以在单独的执行线程中执行while
循环,只要您采取必要的多线程预防措施,例如锁,条件变量,等待句柄等。
如果您正在使用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()
。