qq512145547
缝补茗
采纳率100%
2020-07-29 11:11

由于线程退出或应用程序请求,已中止 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;
        }
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • caozhy 回答这么多问题就耍赖把我的积分一笔勾销了 8月前

    首先把异步访问换成同步访问,或者在线程函数结束的地方加上Application.Run();或者Console.Read()看看是否不会报错。应该是线程本身结束了,但是异步还没有返回造成的。

    点赞 1 评论 复制链接分享
  • jingluan666 jingluan666 8月前

    写入更多日志进行分析,比如网络连接,内存占用,像这种情况最好在每步处理都加日志,便于维护分析

    点赞 评论 复制链接分享

为你推荐