c# - 延迟控制台应用程序几秒钟的最佳方法是什么

标签 c# .net multithreading windows-services parallel-processing

概述。

我有一个用 C# .NET 4.0 编写的 Windows 服务,它连接到 Betfair API 以自动下注(所有下注决策都在 SQL DB 中完成)。该服务有许多计时器,为 3 个主要区域设置一些轮询(下注待定、检查价格、下注[比赛期间])。计时器每 30 秒触发一次。

我遇到困难的是 InPlay 投注。计时器每 30 秒调用一次 BetfairBot 对象中的方法,检查即将进行的比赛是否有正在进行的投注。可能有多个系统对同一场比赛进行投注,因此我想并行启动“控制”方法,这样一个系统就不会等待另一个系统完成才能下注。

所以我有一些像这样的代码来触发并行控制方法

// some SQL to get my upcoming races
DataTable sqlRecordset = this.dataAccess.GetDataTable(SQL);

try
{

// run in parallel for each system and concurrent races

Parallel.ForEach(sqlRecordset.AsEnumerable(), recordsetRow =>
{

    betfairLogon = recordsetRow["BetfairLogon"].ToString();
    betfairPassword = recordsetRow["BetfairPassword"].ToString();
    SystemPK = Convert.ToInt32(recordsetRow["SystemPK"]);
    systemName = recordsetRow["SystemName"].ToString();
    RacePK = Convert.ToInt32(recordsetRow["RaceFK"]);

    // spawn thread for each system    
    this.RunInPlayBettingControl(SystemPK, betfairLogon, betfairPassword, systemName, RacePK);

});


}
catch (Exception e)
{
// log error
HelperLib.LogMsg("Error starting Parallel Threads for RacePK: " + RacePK.ToString() + " - " +e.Message.ToString());
}

然后在我的控制方法中,我循环直到投注结束,调用另一个处理投注的方法并返回一个结果代码,告诉我的系统投注的状态,例如比赛是否已结束、尚未开始或即将开始开始。

在其中一些状态下,我想在重新调用下注方法之前将线程延迟几秒钟。

我已经尝试过

Thread.Sleep(2500);

但这根本不会等待,并且下注过程会立即再次调用,而无需等待。

我已经阅读了一些有关线程的内容,但我不知道问题是否出在我的并行循环上,该循环触发了对我的控制方法的并行调用(需要按需延迟线程),或者问题出在我的控制方法和Thread.Sleep(延迟)调用。

我在服务类中的初始计时器工作正常,我不知道解决这个问题的最佳方法,也不知道延迟的问题是什么,因为我假设并行循环启动的每个线程都将在其上运行拥有,因此如果需要的话会延迟 .Sleep 调用。

我应该使用更多计时器还是其他方法,以及现有循环代码的最佳方法是什么?

并行循环触发的 Control 方法如下。实际投注方法的代码太复杂,无法在此处发布,但它没有线程调用,只是一些 SQL 和对 Betfair API 的一些调用。

任何帮助将不胜感激。提前致谢。

public void RunInPlayBettingControl(int SystemPK,string betfairLogon, string betfairPassword, string systemName, int RacePK)
{
int result = 0;
bool quit = false; // we loop until true

// decode our encrypted logon details
betfairPassword = HelperLib.GetPassword(betfairLogon);
betfairLogon = HelperLib.DecodeLogon(betfairLogon);

// create API object
this.betfairAPI = new BetfairAPI(systemName);

// try and log in for this system and save the session for future use

if (!String.IsNullOrEmpty(betfairLogon) && !String.IsNullOrEmpty(betfairPassword))
{

// check logged in status as we might have used previous session otherwise log in now
if (!this.betfairAPI.IsLoggedIn() && this.betfairAPI.Login(betfairLogon, betfairPassword) == false)
{
    // couldnt login so exit
    return;
}
else
{                  

    // save session to file
    this.betfairAPI.SaveSession(systemName);

    // we loop until we know there is no more point in doing so
    while (!quit)
    {
    // result code values
    // 0 = We have no idea whats going on yet
    // 1 = Race is actually closed/finished so exit
    // 2 = Race is inplay but we are not ready to bet yet - wait a short while
    // 3 = Race is inplay and ready to bet
    // 4 = Race is not inplay yet so wait a bit and carry on

    // this is our main betting method that handles all our betting
    result = this.RunInPlayBetting(SystemPK, betfairLogon, betfairPassword, systemName, RacePK);

    // check result to see if we quit looping
    switch (result)
    {
        case 1:
        // race is over so exit
        quit = true;
        break;
        case 2:
        // race is in play but not over our marker yet so go back in after a short wait
         Thread.Sleep(1000);  // NOT WORKING
        quit = false;

        break;
        case 3:
        // race is in play so lets go straight back in and try some more betting
        quit = false; 
        break;
        case 4:
        // not in play yet so keep looping after a short wait
        quit = false;

        Thread.Sleep(2500); // NOT WORKING

        break;

        case 0:
        // have no idea whats going just quit loop
        quit = true;
        break;

    }
    }
}

}   

return;
}

最佳答案

Thread.Sleep(2500);

But this doesn't wait at all and the betting proc is called instantly again without waiting.

Thread.Sleep() 会将当前线程挂起指定的时间。您所看到的是执行相同方法的其他线程(我假设您在那里有一个断点用于检查),因为您使用Parallel.ForEach()生成了一堆线程.

关于c# - 延迟控制台应用程序几秒钟的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9069136/

相关文章:

c# - Mvc Asp 排序项目

c# - 使用 C# 将 lnk 文件固定到 Windows 7 任务栏

c# - IE不会在浏览器中显示生成的PDF

c# - 如何在 MongoDB .Net 中更新插入文档?

c# - 如果在构造函数中设置 DataContext,在调用 InitializeComponent() 之前或之后设置它是否重要?

后台 Python 函数

python - 如果同时读取和追加同一个文件(python 编程),会发生什么情况?

c# - 为什么我可以检查 DateTime 是否为 null,即使它是一个值类型?

.net - 如何配置 COM 版本以使用由 RegAsm.exe 注册的 .NET 程序集?

android - Qt 5.7 for Android 主 C++ 线程不连续运行