如何创建不同线程可以使用的变量?(C#)

如何创建不同线程可以使用的变量?(C#),c#,multithreading,console,global-variables,C#,Multithreading,Console,Global Variables,我是C#的新手,所以请尽量简单,尽可能多地解释 这是我现在的代码: using System; using System.Threading; class MathQuiz { static void Main() { Thread ask = new Thread (new ThreadStart (prompt)); ask.Start(); Console.ReadKey(); } static void prompt() { Co

我是C#的新手,所以请尽量简单,尽可能多地解释

这是我现在的代码:

using System;
using System.Threading;
class MathQuiz
{
  static void Main() 
  {
    Thread ask = new Thread (new ThreadStart (prompt));

    ask.Start();
    Console.ReadKey();
  }

  static void prompt()
  {
    Console.WriteLine ("Testing!");
  }
}
但是,我想做的是让新线程将ConsoleKeyInfo读取到对象。然后,如果用户在10秒钟内没有按任何键,他们将继续下一个问题,该问题将以不同的答案重复该过程

希望你还和我在一起

我需要在主线程中有一个变量,该变量可以在“提示”线程中修改和调用


我该怎么做呢?

你可以在你的课堂上创建一个
静态
字段

或者,您可以将匿名委托传递给线程构造函数;它将能够访问局部变量


在这两种情况下,它也应该是volatile的,线程仍然可以访问您在同一类中定义的变量。提示函数将无法访问,因为您已将其定义为静态。创建一个静态变量,并将函数作为mathquick.prompt传递给ThreadStart

另外,要注意

对于下面的注释,它们是跨线程共享的:

void Main() 
{
    a.doit();
}

public class a
{
      private static int i = 1;
      public static void doit()
      {
        Thread ask = new Thread (new ThreadStart (prompt));

        ask.Start();
        Console.WriteLine(i);
        Console.Read();
        Console.WriteLine(i);
      }

    static void prompt()
    {
        Console.WriteLine ("Testing!");
        a.i++;
    }
}

将其标记为
static volatile
,这样线程就可以在不创建类实例的情况下访问它,并对其进行修改,并在所有线程中使用相同的值。

会的。但如果您试图更改在不同线程中设置的值,原始线程仍将获得旧值,因为变量不是“共享”的。因此,您应该将其标记为volatile。原始线程不会获得旧值,返回的值是不可预测的,这就是锁很重要的原因。volatile关键字只是让锁为您工作就我对锁例程的理解而言,volatile是不同的。虽然锁阻止其他线程访问代码的易受攻击部分(例如更改var的值),但volatile会将字段标记为可同时对所有线程访问,因此它与静态字段类似,但对线程而言。锁不会阻止线程访问变量,而是强制线程同步访问变量。Volatile也做了同样的事情,并引入了一种读写器锁来访问变量。谢谢你澄清这个话题。把什么标记为static volatile?我试了几个地方都没用。一个属于MathQuit类的变量。因此,它将能够被任何线程修改,访问它的每个对象都将具有最新的值。你也可以使用这个变量来控制线程的行为(例如,当主应用程序的线程中出现某些东西时停止它)。我不知道“it”是什么。变量?班级?方法?@IanVal:字段/变量。