我正在撰写一份能够分析股票市场变化的计划。
每次更新股票图表上的蜡烛时,我的算法会扫描每个图表以查找某些数据。我注意到这个过程每次花费大约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(); 知道我在那里做错了什么?
答案 0 :(得分:1)
你的问题的答案实际上非常简单:
Thread myThread = new Thread(checkCharts.RunAlgo);
myThread.Start();
但是,更复杂的部分是确保当方法RunAlgo
访问checkCharts对象中的变量时,这会以线程安全的方式发生。
有关如何同步访问多个线程的数据的帮助,请参阅Thread Synchronization。
答案 1 :(得分:0)
我宁愿使用Task.Run
而不是Thread
。 Task.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();
}
}