PiZ*_*zL3 2 c# return backgroundworker checkpoint
有没有办法缩短我的 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*/;
}
Run Code Online (Sandbox Code Playgroud)
我试图使这样的多检查点情况更具可读性:
//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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!!
没有办法调用methodA来调用methodB并让methodB返回methodA(因为我们没有尾递归)
考虑使用像这样的迭代器.它可以在某些情况下工作,您可以在其中放置try/catch中间检查点.
public void FakeBWTask()
{
if (this.TW.CancellationPending)
return;
foreach (object ignore in FakeBWTaskSteps())
{
// Other checkpoint logic here....
if (this.TW.CancellationPending)
return;
}
}
private IEnumerable<object> FakeBWTaskSteps()
{
Part1();
yield return null; // Execute checkpoint logic.
Part2();
yield return null; // Execute checkpoint logic.
Part3();
yield return null; // Execute checkpoint logic.
Part4();
yield return null; // Execute checkpoint logic.
// Do some other stuff.
yield return null; // Execute checkpoint logic.
// final stuff. No looping here.
}
Run Code Online (Sandbox Code Playgroud)