首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将线程添加到线程数组中

将线程添加到线程数组中
EN

Stack Overflow用户
提问于 2015-09-25 14:21:26
回答 3查看 750关注 0票数 2

看看我的密码。

代码语言:javascript
复制
Thread[] connect_thread;
public void thread_runned()
{
    connect_thread = new Thread[dataGridView1.SelectedRows.Count];
    for (int index = 0; index < dataGridView1.SelectedRows.Count; index++)
    {
        connect_thread[index] = new Thread(new ThreadStart(connect));
        connect_thread[index].Start();
    }
}
public void connect()
{
   //performance code here
}
public void ButtonClick1()
{
    //User select rows 0-4
    thread_runned();
}

public void ButtonClick2()
{
    //User select rows 5-9
    thread_runned();
}

根据上面的代码,当我运行它并单击ButtonClick1ButtonClick2时,它返回两个不同的connect_thread(有关更多细节,请参见此调试)。

代码语言:javascript
复制
//Debug when ButtonClick1 is running
connect_thread = array(
    [0] = System.Threading.Thread
    [1] = System.Threading.Thread
    [2] = System.Threading.Thread
    [3] = System.Threading.Thread
)

//Debug when ButtonClick2 is running
connect_thread = Error: Index was outside the bounds of the array.

现在,我想在这个线程数组中添加一个新的线程项,但是indeces必须像旧线程项一样继续(即下一个标识符将是[4][5][6]等)。

我不担心这个错误:

代码语言:javascript
复制
//Debug when ButtonClick2 is running
connect_thread = Error: Index was outside the bounds of the array.

因为我可以使用dataGridView1.Rows.Count创建一个线程列表,它可以正常工作。但是,我希望以另一种方式来做,因为当用户向dataGridView中添加更多数据时,索引将再次出错。

如何在保留识别码的同时将新线程添加到线程数组的末尾?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-25 14:28:29

只需尝试用如下所示的列表替换数组:

代码语言:javascript
复制
List<Thread> connect_thread = new List<Thread>()
public void thread_runned()
{
    for (int index = 0; index < dataGridView1.SelectedRows.Count; index++)
    {
        connect_thread.add(new Thread(new ThreadStart(connect)));
        connect_thread[connect_thread.Count-1].Start();
    }
}
票数 3
EN

Stack Overflow用户

发布于 2015-09-25 14:29:28

由于您有一个具有定义大小的数组,因此它不是为数组定义新大小的好方法。相反,您可以使用一个List<Thread>并为示例添加需要多少个线程:

代码语言:javascript
复制
List<Thread> connect_threads;

public void thread_runned()
{
    int total =  dataGridView1.SelectedRows.Count;

    // define the array
    connect_threads = new List<Thread>();   

    // define threads all threads on the list
    for (int index = 0; index < total; index++)
        connect_threads.Add(new Thread(new ThreadStart(connect)));

    // start all threads on the list
    foreach(var thread in connect_threads)
        thread.Start();

    // if you want to wait all the threads on the list to finish
    foreach(var thread in connect_threads)
        thread.Join();              
}
票数 3
EN

Stack Overflow用户

发布于 2015-09-25 14:57:12

为了便于讨论,请使用ThreadPool

代码语言:javascript
复制
    Int32 _ActiveThreadCount = 0;

    delegate void SetTextCallback(String text);

    public Int32 ActiveThreadCount
    {
        get 
        { 
            return _ActiveThreadCount; 
        }
        set 
        {
            _ActiveThreadCount = value;
            SetText(value.ToString());
        }
    }

    private void OnThreadCallback(Object state)
    {
        System.Threading.Thread.Sleep(1000);
        ActiveThreadCount--;
    }

    private void SetText(String text)
    {
        if (label2.InvokeRequired)
        {
            SetTextCallback callback = new SetTextCallback(SetText);
            this.Invoke(callback, text);
        }
        else
        {
            this.label2.Text = text;
        }
    }

使用

代码语言:javascript
复制
System.Threading.ThreadPool.QueueUserWorkItem(
    new System.Threading.WaitCallback(OnThreadCallback), null);
ActiveThreadCount++;

至于其余的问题,我不太清楚到底是什么问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32784318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档