Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查x秒是否已通过,如果未通过,请等待x秒_C#_.net - Fatal编程技术网

C# 检查x秒是否已通过,如果未通过,请等待x秒

C# 检查x秒是否已通过,如果未通过,请等待x秒,c#,.net,C#,.net,我正在努力解决一个问题。这是一个交易机器人,在交易所,有一个规则。你不能在交易后交易,如果你想交易,你必须在第一次交易后等待5秒。5秒钟后,交易取决于你,买,卖或什么都不做 我有秒表,我调用a函数,函数结束后,计时器将启动,我调用b函数,如果计时器值5)但它会消耗cpu,如果它的单核在5秒内将是无止境的循环 有什么办法吗?或者有什么想法?对不起,我的英语和任何帮助感谢 更新 如果之前没有交易(5秒或更长),则不应等待5秒。所以线程睡眠或计时器不起作用。类似的东西 bool TradeEnable

我正在努力解决一个问题。这是一个交易机器人,在交易所,有一个规则。你不能在交易后交易,如果你想交易,你必须在第一次交易后等待5秒。5秒钟后,交易取决于你,买,卖或什么都不做

我有秒表,我调用
a函数
,函数结束后,计时器将启动,我调用
b函数
,如果计时器值<5秒,它应该等待5秒过去

我做了一个
while(true)
,我可以检查
是否(计时器>5)
但它会消耗cpu,如果它的单核在5秒内将是无止境的循环

有什么办法吗?或者有什么想法?对不起,我的英语和任何帮助感谢

更新


如果之前没有交易(5秒或更长),则不应等待5秒。所以线程睡眠或计时器不起作用。

类似的东西

bool TradeEnabled = true;
DateTime LastTrade;

Timer TradeEnabler;
Timer TradeExectuer;

void RequestTrade()
{
    if (TradeEnabled)
    {
        ExecuteTrade();
    }
    else
    {    
        TimeSpan delaySpan = DateTime.Now - LastTrade;        
        int delay = (int)delaySpan.TotalMilliseconds;
        TradeExecuter = new Timer(delay);
        TradeExecuter.Elapsed += ExecuteTrade;
        TradeExecuter.Enabled = true;
    }
}

void EnableTrade(object sender, ElapsedEventArgs args) 
{
    TradeEnabled = true;
    TradeEnabler.Stop();
    TradeEnabler.Dispose();

}

void ExecuteTrade(object sender, ElapsedEventArgs args)
{
    // Execute Trade
    TradeExecuter.Stop();
    TradeExecuter.Dispose();
    LastTrade = DateTime.Now;

    TradeEnabled = false;

    TradeEnabler = new Timer(5000);
    TradeEnabler.Elapsed += EnableTrade;
    TradeEnabler.Enabled = true;
}

这是一个基于计时器的解决方案。需要注意的重要事项是

  • NET中有几个计时器类。选择最适合你的 你

  • 了解计时器触发的
    线程
    是非常重要的

  • 计时器不会完全按照您设定的时间间隔启动

     public class Trade
     {
         public string Symbol { get; }
         public DateTime TradeTimeUTC { get; }
     }
    
     public class Order
     {
         public string Symbol { get; }
     }
    
     public void SendOrder(Order order)
     {
         //Find most recent trade for this order, out of scope here
         var trade = GetMostRecentTrade(order);
         var differenceInTime = DateTime.UtcNow - trade.TradeTimeUTC;
         if (differenceInTime.TotalSeconds >= 5)
         {
             ActuallySendOrder(order);
             return;
         }
         System.Timers.Timer timer = new System.Timers.Timer()
         {
             AutoReset = false,
             Interval = differenceInTime.TotalMilliseconds
         };
         //You're on a ThreadPool thread when this fires, adjust accordingly
         timer.Elapsed += (s, e) => { ActuallySendOrder(order); };
         timer.Start();
     }
    

@NeilW但使用计时器,您必须始终等待5秒。也许我以前没有交易过,它应该在不等待的情况下同时进入该函数。有多种方法可以做到这一点,但您可以使用布尔标志(TradeDisabled),该标志由5秒计时器更改。如果您试图在TradeDisable期间输入交易,则不接受该交易。如果您希望该交易被接受但在5秒后才执行,则可以保留上次交易的时间戳,并开始5秒的时间减去现在与上次交易时间戳之间的差值。@mnnavc您可以更改计时器的等待时间。请注意计时器的精度。无论您使用的是哪种定时器,它都不会在您希望的精确时间发射。这是一个足够大的差异,如果你与其他自动交易系统竞争,他们会更快到达那里。如果你不在乎尽可能快地到达书的顶部,那么计时器在这里是非常有意义的。嘿,我遇到了这样的错误。“ExecuteTrade”没有重载匹配委托“ElapsedEventHandler”,我在google和stackoverflow上检查过,但您的代码看起来不错。我该怎么解决呢?为了简单起见,我的答案并不完整。它更多的是展示解决方案的体系结构。处理计时器的方法需要参数(对象源,ElapsedEventArgs e)。看见正在更新答案。这在
TradeEnabled
中存在线程问题。是的,请使用ZerO的答案。