计算循环迭代并做一些事情

  • 本文关键字:循环 迭代 计算 c#
  • 更新时间 :
  • 英文 :


iam正在寻找一个计数器,在for循环中计数我的迭代。

因此,它应该至少尝试我的功能5次,如果我的功能不成功,它应该在尝试5次后跳过该部分并开始下一个任务。

如何计算此部分并将其设置为5次迭代的最大寿命

我已经尝试添加Stopwatch,但这只计算时间,而不计算迭代次数。

for (int i = 0; i < 5; i++)
{
try
{
token.ThrowIfCancellationRequested();
await Task.Delay(100, token);
lbStatus.Invoke((MethodInvoker)(() => lbStatus.Text = "Search Portal..."));
float threshold = 0.7f;
var enemyTemplate =
new Image<Bgr, byte>(resourceFolder + "/portalenter.png");
var enemyMask =
new Image<Bgr, byte>(resourceFolder + "/portalentermask.png");
Point myPosition = new Point(150, 128);
Point screenResolution = new Point(1920, 1080);
// Main program loop
var enemyDetector = new EnemyDetector(enemyTemplate, enemyMask, threshold);
var screenPrinter = new PrintScreen();
screenPrinter.CaptureScreenToFile("screen.png", ImageFormat.Png);
var screenCapture = new Image<Bgr, byte>("screen.png");
var enemy = enemyDetector.GetClosestEnemy(screenCapture);
if (enemy.HasValue)
{
token.ThrowIfCancellationRequested();
await Task.Delay(100, token);
CvInvoke.Rectangle(screenCapture,
new Rectangle(new Point(enemy.Value.X, enemy.Value.Y), enemyTemplate.Size),
new MCvScalar(255));
var inputSimulator = new InputSimulator();
double x1 = 963f / myPosition.X;
double y1 = 551f / myPosition.Y;
token.ThrowIfCancellationRequested();
await Task.Delay(100, token);
var x2 = x1 * enemy.Value.X;
var y2 = y1 * enemy.Value.Y;
if (x2 <= 963)
x2 = x2 * 0.68f;
else
x2 = x2 * 1.38f;
if (y2 <= 551)
y2 = y2 * 0.68;
else
y2 = y2 * 1.38;
token.ThrowIfCancellationRequested();
await Task.Delay(100, token);
var absolutePositions = PixelToAbsolute(x2, y2, screenResolution);
inputSimulator.Mouse.MoveMouseTo(absolutePositions.Item1, absolutePositions.Item2);
au3.Send("{G}");
if (txtLEFT.Text == "LEFT")
{
inputSimulator.Mouse.LeftButtonClick();
}
else
{
inputSimulator.Mouse.RightButtonClick();
}
au3.Send("{G}");
Thread.Sleep(1000);
if (txtLEFT.Text == "LEFT")
{
inputSimulator.Mouse.LeftButtonClick();
}
else
{
inputSimulator.Mouse.RightButtonClick();
}
au3.Send("{G}");
Thread.Sleep(1000);
token.ThrowIfCancellationRequested();
await Task.Delay(100, token);
}
else
{
/// DO SOMETHING AFTER 5 iterations
cts.Cancel();
lbStatus.Invoke((MethodInvoker)(() => lbStatus.Text = "Portal not found! Restart..."));
var t13 = Task.Run(() => Exit2(token));
await Task.WhenAny(new[] { t13 });
}
}
catch (AggregateException)
{
Console.WriteLine("Expected");
}
catch (ObjectDisposedException)
{
Console.WriteLine("Bug");
}
catch
{
}
}

您的意思是运行一些代码,如果失败,请重试,但最多5次?你可以这样做:

for (int i = 5; i > 0; i--) {
try {
doSomething();
break; // Break if successful.
} catch (Exception e) {
// TODO Print the exception, etc.
Thread.Sleep(1000); // Delay the next iteration.
// Optional: Rethrow if it is the last iteration.
if (i == 0) {
throw e;
}
}
}

您可以用实际代码替换doSomething();行,也可以调用执行该操作的(私有(方法。后者通常是首选,因为您将循环结构与实际代码分开。

请注意,休息是在工作之后放置的。因此,如果doSomething()失败,它将跳过break;行,直接进入catch(然后进入下一次迭代(。如果成功,它就会脱离循环。

我会使用while循环。如果失败则增加计数器,如果成功或失败次数太多则退出

int n = 0;
bool success = false;
do
{
//Do something
if(failed)
{
n++;
}
else
{
success = true;
}
} while (n < 5 || !success);

您可以在5次迭代之前对任何内容使用if语句,然后在第五次迭代之后对另一个语句使用if语句。

for (int i = 0; i <= 5; i++) {
try {
if (i < 5) {
// DO EVERYTHING YOU WANT BEFORE 5 ITERATIONS
} else {
// DO EVERYTHING AFTER 5
}
}
catch { }
}

我将忽略您的大部分代码,因为我不确定它是否与问题相关。您使用for循环运行了5次。

如果成功,我建议你设置一个标志,然后在循环完成后检查是否需要运行补偿操作:

var success = false;
for (var i = 0; i < 5; i++)
{
try
{ 
// your code here
// if completed, set success and break out of loop
success = true;
break;
}
catch 
{ 
// your error handling here
}
}
if (success == false)
{
// this code executes if action failed after 5 attempts
}

最新更新