线程化对象中包含的方法 - C#

时间:2017-02-02 01:41:01

标签: c# multithreading algorithm

我正在撰写一份能够分析股票市场变化的计划。

每次更新股票图表上的蜡烛时,我的算法会扫描每个图表以查找某些数据。我注意到这个过程每次花费大约0.6秒,冻结了我的应用程序。它不会陷入循环,并且没有其他问题,例如异常错误会降低它。这只需要一点时间。

为了解决这个问题,我试图看看我是否可以对算法进行处理。

为了调用算法检查图表,我必须这样称呼:

checkCharts.RunAlgo();

由于线程需要一个对象,我试图弄清楚如何运行RunAlgo(),但我没有运气。

如何在checkCharts对象中运行此方法的线程?由于反向传播数据,我无法启动新的checkCharts对象。我必须从现有对象继续使用该方法。

编辑:

我试过了:

M4.ALProj.BotMain checkCharts = new ALProj.BotMain(); 
Thread algoThread = new Thread(checkCharts.RunAlgo); 

它告诉我 checkCharts.RunAlgo checkCharts 部分给了我," 非静态字段需要对象引用,方法或财产" M4.ALProj.BotMain" 。"

在一个特定的if语句中,我打算把 algoThread.Start(); 知道我在那里做错了什么?

3 个答案:

答案 0 :(得分:1)

你的问题的答案实际上非常简单:

Thread myThread = new Thread(checkCharts.RunAlgo);
myThread.Start();

但是,更复杂的部分是确保当方法RunAlgo访问checkCharts对象中的变量时,这会以线程安全的方式发生。

有关如何同步访问多个线程的数据的帮助,请参阅Thread Synchronization

答案 1 :(得分:0)

我宁愿使用Task.Run而不是ThreadTask.Run使用经过优化的ThreadPool来有效处理各种负载。您还将获得Task的所有好处。

await Task.Run(()=> checkCharts.RunAlgo);

答案 2 :(得分:0)

试试这个代码块。它是一个基本的样板,但你可以很容易地构建和扩展它。

//If M4.ALProj.BotMain needs to be recreated for each run then comment this line and uncomment the one in DoRunParallel()
private static M4.ALProj.BotMain checkCharts = new M4.ALProj.BotMain();
private static object SyncRoot = new object();
private static System.Threading.Thread algoThread = null;
private static bool ReRunOnComplete = false;
public static void RunParallel()
{
    lock (SyncRoot)
    {
        if (algoThread == null)
        {
            System.Threading.ThreadStart TS = new System.Threading.ThreadStart(DoRunParallel);
            algoThread = new System.Threading.Thread(TS);
        }
        else
        {
            //Recieved a recalc call while still calculating
            ReRunOnComplete = true;
        }
    }
}
public static void DoRunParallel()
{
    bool ReRun = false;
    try
    {
        //If M4.ALProj.BotMain needs to be recreated for each run then uncomment this line and comment private static version above
        //M4.ALProj.BotMain checkCharts = new M4.ALProj.BotMain();
        checkCharts.RunAlgo();
    }
    finally
    {
        lock (SyncRoot)
        {
            algoThread = null;
            ReRun = ReRunOnComplete;
            ReRunOnComplete = false;
        }
    }
    if (ReRun)
    {
        RunParallel();
    }
}