如何控制线程,因为它的工作不正确

本文关键字:因为 工作 不正确 线程 何控制 控制 | 更新日期: 2023-09-27 17:53:11

我的问题是:

我想遍历所有的ListStudent;它有五行

我使用for()循环通过ListStudent中的所有元素并启动相应的线程。

必须运行StartProcess(dtStudent.Rows[0].ToString(), 1);以' ' StartProcess(dtStudent.Rows[5].ToString(), 1); '

但是当我试图调试时,在while (run_process[idxThread].bwIsRun == true)行-变量idxThread总是5。

我希望它只运行第一个线程,因为我将输入到一个程序。之后,当我再次点击btnProcess时,它将继续下一个dtStudent.Rows

有什么方法可以做到这一点吗?谢谢. .

我不需要知道我的代码有问题。

这是我所有的代码:

LThread[] run_process =new LThread[0];
int num_process = 0;
public void btnProcess()
{
    DataTable dtStudent = mysql_db.ExcelLoad("ListStudent");
    int total_row_student = dtStudent.Rows.Count;        // 5 rows
    if (num_process != total_row_student)
    {
        run_process = new LThread[total_row_student];
        for (int idx = 0; idx < total_row_student; idx++)
        {
            run_process[idx] = new LThread();
            run_process[idx].StartedEvent += new LThread.startDelegate(delegate (string arg)
            {
                StartProcess(dtStudent.Rows[idx - 1]["number"].ToString(), idx - 1);
            });
        }
    }
    num_process = total_row_student;
    if (num_process == 0)
        return;
    flag = true;
    Start_all_thread();
}
private void Start_all_thread()
{
    for (int i = 0; i < run_process.Length; i++)
        if (run_process[i] != null)
            run_process[i].Start();
}
private void Stop_all_thread()
{
    for (int i = 0; i < run_process.Length; i++)
        if (run_process[i] != null)
            run_process[i].Stop();
}
private void StartProcess(string output, int idxThread)
{
    while (run_process[idxThread].bwIsRun == true)
    {
        if (flag == false)
            continue;
        // some code at here
        Stop_all_thread();
    }
} 

类LThread.cs定义:

public class LThread2
{
    public delegate void startDelegate(string ID);
    public event startDelegate StartedEvent;
    public Boolean bwIsRun;
    MicroTimer microTimer = new MicroTimer();
    public LThread2()
    {
        microTimer.MicroTimerElapsed +=
            new MicroTimer.MicroTimerElapsedEventHandler(OnTimedEvent);
        microTimer.Interval = 2000; 
    }
    private static int RandNumber(int Low, int High)
    {
        Random rndNum = new Random(int.Parse(Guid.NewGuid().ToString().Substring(0, 8), System.Globalization.NumberStyles.HexNumber));
        int rnd = rndNum.Next(Low, High);
        return rnd;
    }
    public void Start()
    {
        try
        {
            bwIsRun = true;
            microTimer.Enabled = true;
        }
        catch { }
    }
    public void Stop()
    {
        try
        {
            bwIsRun = false;
            microTimer.Enabled = false;
        }
        catch { }
    }
    private void OnTimedEvent(object sender,MicroTimerEventArgs timerEventArgs)
    {
        StartedEvent(RandNumber(100, 10000).ToString());
    }
}
/// <summary>
/// Class emulates long process which runs in worker thread
/// and makes synchronous user UI operations.
/// </summary>
public class LThread : BackgroundWorker
{
    #region Members
    public delegate void startDelegate(string ID);
    public event startDelegate StartedEvent;
    private static int RandNumber(int Low, int High)
    {
        Random rndNum = new Random(int.Parse(Guid.NewGuid().ToString().Substring(0, 8), System.Globalization.NumberStyles.HexNumber));
        int rnd = rndNum.Next(Low, High);
        return rnd;
    }
    protected override void OnDoWork(DoWorkEventArgs e)
    {
        StartedEvent(RandNumber(100,10000).ToString()); //put whatever parameter suits you or nothing
        base.OnDoWork(e);
        e.Result = e.Argument;
    }
    BackgroundWorker bwThread;
    // Main thread sets this event to stop worker thread:
    public Boolean bwIsRun;
    int m_time_delay = 10000;
    Delegate m_form_method_run;
    Delegate m_form_method_stop;
    Form m_type_form;
    #endregion
    #region Functions
    public void Start()
    {
        try
        {
            bwIsRun = true;
            this.RunWorkerAsync();
        }
        catch { }
    }
    public void Stop()
    {
        try
        {
            bwIsRun = false;
        }
        catch { }
    }
    private void StartToListen(object sender, DoWorkEventArgs e)
    {
        while (true)
        {
            Thread.Sleep(m_time_delay);
            if (bwIsRun == true)
            {
                m_type_form.Invoke(m_form_method_run);                    
            }
            else
            {
                BackgroundWorker bwAsync = sender as BackgroundWorker;
                if (bwAsync.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }
                break;
            }
        }
    }
    #endregion
}

如何控制线程,因为它的工作不正确

您的问题可能在for (int idx = 0; idx < total_row_student; idx++) for循环中。你启动的线程将在循环结束后很长时间才启动,所以变量idx在任何线程实际启动之前已经在5了。

尝试更改代码以修复:

for (int idx = 0; idx < total_row_student; idx++)
{
    int local_idx = idx;
    run_process[idx] = new LThread();
    run_process[idx].StartedEvent += new LThread.startDelegate(delegate (string arg)
    {
        StartProcess(dtStudent.Rows[local_idx - 1]["number"].ToString(), local_idx - 1);
    });
}