C#threading - 主线程卡在inf循环中

时间:2018-04-28 01:50:06

标签: c# multithreading

我的简单增量游戏线程遇到了问题。 当我开始该线程时,它似乎没有启动一个实际的线程,所以我陷入线程RunThread方法的无限循环。

我在c#中进行线程化的方式是继承自这个基本线程类,SO上的其他人给出了这个代码,允许你从Thread继承。

abstract class BaseThread
{
    private Thread _thread;

    protected BaseThread()
    {
        _thread = new Thread(new ThreadStart(this.RunThread));
    }

    // Thread methods / properties
    public void Start() => _thread.Start();
    public void Join() => _thread.Join();
    public bool IsAlive => _thread.IsAlive;


    // Override in base class
    public abstract void RunThread();
    }

然后继承该基本线程。 Person继承自Base Thread。

abstract class Person : BaseThread
{
    public BigInteger amt = new BigInteger(0);
    public BigInteger pow = new BigInteger(1);
    public BigInteger cost = new BigInteger(100);
    public ResourceManagement res= ResourceManagement.Instance;
    public static bool PeopleThreads = true;

    public override void RunThread()
    {

    }
 }

并且在最低级别,我有一个Farmer,它继承自Person。

class Farmer : Person
{
    public override void RunThread()
    {
        while (PeopleThreads)
        {
            Thread.Sleep(5000);
            res.AddFood(amt * pow);
            Thread.Sleep(5000);
            res.AddFood(amt * pow);
            res.subtractFromRes("Food", amt);
        }
    }
}

在我的线程管理器课程中,我正在做农民.RunThread();它似乎让我陷入了while循环而不是创建一个新的线程。这是我第一次真正尝试c#threading之前已经完成了java线程,这就是为什么我希望能够从Thread继承。这是我开始学习的地方。

class PeopleManager
{
    Farmer farmers = new Farmer();
    Lumberjack jacks = new Lumberjack();
    Miner miners = new Miner();
    private static PeopleManager people_Instance= new PeopleManager();
    bool running = false;

    static PeopleManager() { }//DO NOT PUT ANYTHING HERE
    private PeopleManager() { }//DO NOT PUT ANYTHING HERE
    public void StartThreads()
    {
        if (!running)
        {
            farmers.RunThread();
            jacks.RunThread();
            miners.RunThread();
            running = true;
        }            
    }

    public static PeopleManager Instance { get{ return people_Instance; } } 

1 个答案:

答案 0 :(得分:0)

我修复了我的问题,改变了我从runThread到Start()

运行线程的方式
class PeopleManager
{
Farmer farmers = new Farmer();
Lumberjack jacks = new Lumberjack();
Miner miners = new Miner();
private static PeopleManager people_Instance= new PeopleManager();
bool running = false;

static PeopleManager() { }//DO NOT PUT ANYTHING HERE
private PeopleManager() { }//DO NOT PUT ANYTHING HERE
public void StartThreads()
{
    if (!running)
    {
        farmers.Start(); //this instead of RunThread() made it run it 
        jacks.Start();   // run as a thread and not a method call
        miners.Start();   
        running = true;
    }            
}

public static PeopleManager Instance { get{ return people_Instance; } }