【发布时间】:2011-08-03 22:57:56
【问题描述】:
有没有办法缩短我的BackgroundWorker.CancellationPending检查点?
例如,有没有办法像下面的示例代码一样封装return?:
//REAL CODE (CURRENTLY USE THIS)
if (this.TW.CancellationPending)
return;
//PSEUDO REPLACEMENT CODE
this.CkPt(CurrentMethod); //PSEUDO USAGE
//^^^ PARAMETER IS A REFERENCE TO THE CURRENT METHOD, SIMILAR TO `this` FOR AN OBJECT
//OR MAYBE AN EXTENSION METHOD WOULD LOOK CLEANER
CurrentMethod.CkPt(); //PSEUDO USAGE
private void CkPt(Method m) //PSEUDO METHOD
{
/*
POSSIBLY PERFORM OTHER CHECKPOINT TASKS HERE
*/
if (this.TW.CancellationPending)
m.return/*FROM METHOD THAT CALLED ME*/;
}
我正在尝试使这样的多检查点情况更具可读性:
//PSUEDO METHOD
//DO NOT TAKE THIS AS REPEATING CODE
//IT IS ONLY MEANT TO SHOW MULTIPLE USES OF THE SAME CHECKPOINT
//MY REAL TASK METHOD(S) CONTAIN MANY MANY MANY AREAS THAT DON'T REPEAT AND REQUIRE CHECKPOINTS
public void FakeBWTask()
{
if (this.TW.CancellationPending)
return;
foreach (var F1 in Fake1)
{
if (this.TW.CancellationPending)
return;
foreach (var F2 in Fake2)
{
if (this.TW.CancellationPending)
return;
foreach (var F3 in Fake3)
{
if (this.TW.CancellationPending)
return;
}
}
}
}
感谢您的帮助!!
【问题讨论】:
-
嗯,当然是笨拙的代码。将异常注入线程是每个人最喜欢的 bugaboo。线程取消在小于人类感知时间的任何时间都有效是否真的重要? 50 毫秒是一个 hellofalot 的 CPU 周期。
-
是为了阻止事件的发生,只是一个例子。在我的真实代码中,事件比 50 毫秒长得多。我真的不应该把第二个代码放在那里。它破坏了这个问题。
标签: c# backgroundworker return checkpoint