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