c# - 递归调用同一个线程的方法
问题描述
我有以下方法:
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);
}
}
我将此长时间运行的方法称为异步,我不等待它完成。事情是我发生了一个异常,在这种情况下我想处理它。但是后来我想从我离开的地方开始,并使用相同的线程。在当前状态下,当我在处理异常后递归调用该方法时,将使用一个新线程。我想继续使用相同的线程。有没有办法这样做?谢谢!
解决方案
您可能需要在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
在异步方法中,以避免无缘无故地阻塞线程。
推荐阅读
- c# - ASP.NET C#中计算量大的程序是否在服务器端的客户端上运行?
- sql - 使用 Oracle 和搜索顺序的条件 where 子句
- android - 2个视图的Android简单布局
- c++ - 用于类初始化的 SFML 向量
- git - 远程仓库名称在 Github 中更改,但在本地仓库中没有反映 Git 提取
- python - 如何调用这个 tkinter gui 函数?
- python - 从特定 API (BLS) 创建逗号分隔的数据表而不使用 prettytable,如其示例代码所示?
- docker - 将 supervisord 日志记录到文件和标准输出
- python - 如何从这个字符串格式中提取这个字段?
- java - 作为环境变量传递时无法解码货币符号的 unicode