缝补茗 2020-07-29 11:11 采纳率: 100%
浏览 2245
已采纳

由于线程退出或应用程序请求,已中止 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条回答 默认 最新

  • threenewbee 2020-07-29 12:19
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记