【问题标题】:C# - Help skip if await is taking to long [duplicate]C# - 如果等待时间很长,请帮助跳过 [重复]
【发布时间】:2021-01-01 20:51:28
【问题描述】:

我对任务和异步非常陌生,我对如何取消等待 var 状态感到困惑,如果 ping 成功则需要太长时间,但如果它没有 ping 大约 10 秒,这是不切实际的当我想尽快对列表进行排序时

public async void GetServersV2(List<string> ls)
        {
            for (int i = 0; i < ls.Count; i++)
            {
                IMinecraftPinger pinger = new MinecraftPinger(ls[i], (short)port);
                
                try
                {
                    var statuss = await pinger.PingAsync();
                    Console.WriteLineFormatted($"Server: " + ls[i] + " is {0} | {3} online is " + statuss.Players.Online + "/" + statuss.Players.Max + " | " + "{4} is: " + statuss.Version.Name, Color.White, status);
                }
                catch
                {
                    Console.WriteLineFormatted("Server: " + ls[i] + " is {1}", Color.White, status);
                }
            }

        }

【问题讨论】:

标签: c#


【解决方案1】:

一个选项是,运行 2 个任务,pingerTask 和一个 delayTask,并等待第一个获胜:

var pingTask = pinger.PingAsync(); // start the task, but do not await it
var timeoutTask = Task.Delay(TimeSpan.FromSeconds(10)); // create some timeout task
var winnerTask = await Task.WhenAny(pingTask, timeoutTask); // now await until either the timeoutTask or pingTask finishes

if (winnerTask == pingTask) // if the ping is done before the timeout, then...
{
    var statuss = await pingTask;
}
else
{
     // you run into a timeout
}

【讨论】:

  • 我通过编辑 pingasync() 来源的参考解决了这个问题,在 github 上找到了源代码。我将 tcp connect 更改为 connectasync,然后添加了 1000 毫秒的等待,它起作用了,谢谢你们花时间来看看我的问题
猜你喜欢
  • 1970-01-01
  • 2013-06-25
  • 2013-08-02
  • 1970-01-01
  • 2014-02-20
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多