C#多线程逻辑错误

C#多线程逻辑错误,c#,multithreading,threadpool,C#,Multithreading,Threadpool,我不熟悉多线程,但我不知道我的代码有什么问题: public int k; private void button2_Click(object sender, EventArgs e) { k = 10; ThreadPool.SetMinThreads(2, 6); ThreadPool.SetMaxThreads(2, 6); ThreadPool.QueueUserWorkItem(aki); ThreadPool.QueueUserWorkIte

我不熟悉多线程,但我不知道我的代码有什么问题:

public int k;
private void button2_Click(object sender, EventArgs e)
{
    k = 10;
    ThreadPool.SetMinThreads(2, 6);
    ThreadPool.SetMaxThreads(2, 6);
    ThreadPool.QueueUserWorkItem(aki); 
    ThreadPool.QueueUserWorkItem(aki);
}

public void aki(object ab)
{
    do
        {
           this.SetText1(textBox1.Text +
           " thread     " + Thread.CurrentThread.GetHashCode() +
           "               valu=   " + k + Environment.NewLine);
            k--;
        } while (k > 0);
        if (k < 0) Thread.CurrentThread.Abort();    
}
我期望在10,9,8,7,6,5,4,3,2,1,0中有一个输出

请告诉我这有什么问题

我试图一次运行两个线程

怎么办

编辑:在rohit的回答之后,我尝试了这个,但得到了以下输出:

 thread     11               valu=   10
 thread     12               valu=   9
 thread     12               valu=   8
 thread     11               valu=   7
 thread     11               valu=   6
 thread      6               valu=   7
 thread      6               valu=   6
 thread      6               valu=   5
 thread     13               valu=   3
 thread     14               valu=   2
 thread     14               valu=   1

在这次运行中,7和6重复了两次。

这里的问题是两个线程都在处理类的同一个实例变量
k
。 因此,当
一个线程修改该值时,它
会反映在另一个线程中。
输出总是不确定的。好像我得到了这个输出-

 thread     18               valu=   10
 thread     21               valu=   10
 thread     18               valu=   9
 thread     18               valu=   7
 thread     18               valu=   6
 thread     18               valu=   5
 thread     18               valu=   4
 thread     18               valu=   3
 thread     18               valu=   2
 thread     18               valu=   1
 thread     21               valu=   8
您应该在
aki
方法中使用局部变量-

public void aki(object ab)
{
    int k = 10; // <---- HERE
    do
        {
           this.SetText1(textBox1.Text +
                          " thread     " + Thread.CurrentThread.GetHashCode() +
                          "               valu=   " + k + Environment.NewLine);
            k--;
        } while (k >= 0); // It should be less than and equal to 0 to print 0.
        if (k < 0) Thread.CurrentThread.Abort();    
}
public void aki(对象ab)
{
int k=10;//=0);//打印0应小于等于0。
如果(k<0)Thread.CurrentThread.Abort();
}

为什么要将
锁定
?它不会让其他线程并行处理。我需要锁,这样就不会发生这种情况。。。[守则]螺纹11 VAU=10螺纹12 VAU=9螺纹12 VAU=8螺纹11 VAU=7螺纹11 VAU=6螺纹6 VAU=7螺纹6 VAU=6螺纹6 VAU=5螺纹13 VAU=3线程14 VAU=2线程14 VAU=11)永远不要中止池线程2)您的
SetText1()
可能是线程安全的,但即使读取
textBox1。线程中的文本也不安全。因此,我应该使用什么来代替中止…?在这种情况下,一个简单的
返回
中断声明就足够了。它只会让讨论和回答变得更加困难。
public void aki(object ab)
{
    int k = 10; // <---- HERE
    do
        {
           this.SetText1(textBox1.Text +
                          " thread     " + Thread.CurrentThread.GetHashCode() +
                          "               valu=   " + k + Environment.NewLine);
            k--;
        } while (k >= 0); // It should be less than and equal to 0 to print 0.
        if (k < 0) Thread.CurrentThread.Abort();    
}