由于线程退出或应用程序请求,已中止 I/O 操作。
问题描述:
代码说明:
使用递归达到重复执行任务的目的。
错误信息:每次执行了两天左右任务就停止了
fail: ERC20Process[Ethernum][0]
Http ExecuteScan Error
System.Threading.Tasks.TaskCanceledException: The operation was canceled. ---> System.IO.IOException: Unable to read data from the transport connection: 由于线程退出或应用程序请求,已中止 I/O 操作。. ---> System.Net.Sockets.SocketException: 由于线程退出或应用程序请求,已中止 I/O 操作。
--- End of inner exception stack trace ---
上代码:
Program.cs
static void Main() => RunServerAsync().Wait();
static async Task RunServerAsync()
{
……
OpBlock.RechargeScan();
……
}
class OpBlock
{
static Dictionary<WalletType, IRechargeScan> scans = new Dictionary<WalletType, IRechargeScan>();
internal static void RechargeScan()
{
ScanRecharge(WalletType.Ethernum);
}
internal static void ScanRecharge(WalletType wallet)
{
Task.Run(async () =>
{
IRechargeScan op = null;
if (!scans.TryGetValue(wallet, out op))
{
if (wallet == WalletType.Ethernum)
{
op = new ERC20_RechargeScan();
scans.Add(wallet, op);
}
}
await op.Scan();
});
}
}
interface IRechargeScan
{
Task Scan();
}
class ERC20_RechargeScan : IRechargeScan
{
private IERC20Process _Process;
public ERC20_RechargeScan()
{
_Process = TokenServer.GrainFactory.GetGrain<IERC20Process>(WalletType.Ethernum.ToString());
}
public async Task Scan()
{
bool res = await _Process.ScanRecharge();
if (res)
{
await Task.Delay(60000);
await Scan();
}
else
{
await Task.Delay(120000);
await Scan();
}
}
}
public async Task<bool> ScanRecharge()
{
bool execute;
try
{
……
execute = ……;
}
catch (Exception ex)
{
_Logger.LogError(ex, "Http ExecuteScan Error");
execute = false;
}
return execute;
}
答
首先把异步访问换成同步访问,或者在线程函数结束的地方加上Application.Run();或者Console.Read()看看是否不会报错。应该是线程本身结束了,但是异步还没有返回造成的。
答
写入更多日志进行分析,比如网络连接,内存占用,像这种情况最好在每步处理都加日志,便于维护分析