首页 > 解决方案 > 递归调用同一个线程的方法

问题描述

我有以下方法:

public async Task ScrapeObjects(int page = 1)
{
    try
    {
        while (!isObjectSearchCompleted)
        {
            ..do calls..
        }
    }
    catch (HttpRequestException ex)
    {

        Thread.Sleep(TimeSpan.FromSeconds(60));
        ScrapeObjects(page);

        Log.Fatal(ex, ex.Message);
    }
}

我将此长时间运行的方法称为异步,我不等待它完成。事情是我发生了一个异常,在这种情况下我想处理它。但是后来我想从我离开的地方开始,并使用相同的线程。在当前状态下,当我在处理异常后递归调用该方法时,将使用一个新线程。我想继续使用相同的线程。有没有办法这样做?谢谢!

标签: c#multithreading.net-core

解决方案


您可能需要在while循环内移动 try/catch 块,并添加一个发生错误的计数器,以在连续错误尝试的情况下退出。

public async Task ScrapeObjects()
{
    int failedCount = 0;
    int page = 1;
    while (!isObjectSearchCompleted)
    {
        try
        {
            //..do calls..
        }
        catch (HttpRequestException ex)
        {
            failedCount++;
            if (failedCount < 3)
            {
                Log.Info(ex, ex.Message);
                await Task.Delay(TimeSpan.FromSeconds(60));
            }
            else
            {
                Log.Fatal(ex, ex.Message);
                throw; // or return;
            }
        }
    }
}

作为旁注,通常最好await Task.Delay不要Thread.Sleep在异步方法中,以避免无缘无故地阻塞线程。


推荐阅读