我试图在C#中自学线程,我遇到了问题。让我们说这是我的代码:
class MyClass
{
public Queue variable;
internal MyClass()
{
variable = new Queue<int>();
variable.Enqueue(1);
Thread thread = new Thread(new ThreadStart(DoSomething));
thread.IsBackground = true;
thread.Start();
}
public void DoSomething()
{
int i = variable.Dequeue();
MessageBox.Show(i);
}
}
执行时,我得到一个异常,说当我尝试出队时队列是空的。调试显示队列在线程的上下文中是空的,但不在较大的类中。我假设C#为某些事情创建了线程局部对象(但不是全部,如果我要创建一个int成员变量,我可以在线程中获得它的值而没有任何问题)我知道java会做类似的事情,并且周围的方式它是将成员变量声明为&#34; volatile&#34;或类似的东西。 C#有一个类似的结构,但我不会想到它正在寻找的东西(或者至少,我使用它并且它没有帮助......)我如何声明一个成员变量在C#中,类创建的任何线程也可以访问它? (我也非常想更好地理解这些东西,所以非常感谢链接到相关材料)
答案 0 :(得分:1)
class MyClass {
public Queue variable;
internal MyClass() {
variable = new Queue();
variable.Enqueue(1);
Thread thread = new Thread(new ThreadStart(DoSomething));
thread.IsBackground = true;
thread.Start();
}
public void DoSomething() {
int i = (int)(variable.Dequeue()); //cast required here
//MessageBox may not play nice from non-ui thread
Console.WriteLine(i);
}
}
只有最小的编辑才能正常工作。队列在线程中可见。目前尚不清楚你是如何得出不同结论的。
您可以考虑使用通用Queue<int>
到avoid the boxing/unboxing associated with storing value types in non-generic collections。
更好的是,你可以使用ConcurrentQueue<T>
来避免一大堆嘈杂的线程同步,看到你在线程之间共享这个队列。
答案 1 :(得分:0)
我认为你应该改变这两行,它应该有用。
public Queue<int> variable;
MessageBox.Show(i.ToString());