据我所知,这完全是不确定的。您可以从写入的十个零一直到十个十以及其间的所有递增变化一直获取值。
原因是您没有对numCounter
变量进行任何同步和/或序列化的访问。线程只会在线程执行时读取它,这可能随时发生,基于任意数量的环境条件。
因此,获得所有数字且不重复的快速方法是:
public int numCounter;
private void button2_Click(object sender, EventArgs e)
{
for (numCounter = 0; numCounter < 10; numCounter++)
{
Thread myThread = new Thread(myMethod);
myThread.Start(numCounter);
}
}
public void myMethod(object numCounter)
{
Console.WriteLine(numCounter);
}
这里的主要缺点是 1) 的签名myMethod
必须更改,2)numCounter
从 an转换为int
an时会发生装箱,object
以及 3) 这仍然不能保证输出的顺序为预期的 0..10。
这是一个稍微不同的版本,它使用 adelegate
和BeginInvoke
/ EndInvoke
(我喜欢做线程的方式)。它从上面消除了 #2 的缺点,但仍保留 #1 和 #3:
public int numCounter;
private delegate void MyMethodDelegate(int numCounter);
private void button2_Click(object sender, EventArgs e)
{
for (numCounter = 0; numCounter < 10; numCounter++)
{
MyMethodDelegate myDelegate = new MyMethodDelegate(myMethod);
myDelegate.BeginInvoke(numCounter, myMethodDone, myDelegate);
}
}
public void myMethod(int numCounter)
{
Console.WriteLine(numCounter);
}
public void myMethodDone(IAsyncResult result)
{
MyMethodDelegate myDelegate = result.AsyncState as MyMethodDelegate;
if (myDelegate != null)
{
myDelegate.EndInvoke(result);
}
}