2011-01-18 2 views
0

Я новичок в C#, поэтому, пожалуйста, старайтесь быть основным и объяснять вещи как можно больше.Как создать переменную, которую может использовать другой поток? (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 секунд, они переходят к следующему вопросу, который повторяет процесс с другим ответом.

Надеюсь, вы все еще со мной.

Мне нужно, чтобы переменная в потоке MAIN была модифицируемой и вызываемой в потоке «подсказка».

Как я могу это сделать?

ответ

1

Поток будет по-прежнему иметь доступ к переменным, которые вы определили в одном классе. Функция быстрого доступа не будет иметь доступа, поскольку вы определили ее как статические. Создание статической переменной, и передать функцию ThreadStart в MathQuiz.prompt

Кроме того, быть в курсе locking on variables

к комментарию ниже, они являются общими для всех потоков:

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++; 
    } 
} 
+1

Да, будет. Но если вы попытаетесь изменить значение, установленное benn в другом потоке, исходный поток все равно получит старое значение, потому что переменная не является «общей». Таким образом, вы должны отметить это как изменчивое. – beastofman

+1

Исходная нить не получит старое значение, это непредсказуемо в отношении того, какое значение оно вернет, поэтому блокировки важны. Ключевое слово volatile просто блокирует работу для вас. – Rob

+0

Насколько я понимаю, функция блокировок, изменчивость отличается. Хотя блокировка предотвращает доступ других потоков к уязвимым частям кода (например, изменение значения var), поле volatile marks, доступное для всех потоков одновременно, так что это похоже на статическое поле, но для потоков. – beastofman

2

Вы можете сделать поле static в своем классе.

В качестве альтернативы вы можете передать анонимный делегат конструктору потока; он сможет получить доступ к локальным переменным.

В любом случае это также должно быть volatile.

+1

Я не знаю, что это такое. Переменная? Класс? Методы? –

+0

@IanVal: Поле/переменная. – SLaks

5

Mark он как static volatile, так что потоки могут получить к нему доступ, не создавая экземпляр класса и не изменяя его и не используя одно и то же значение для всех потоков.

+0

Отметить как статическую неустойчивость? Я попробовал несколько мест безрезультатно. –

+0

Переменная, принадлежащая классу MathQuiz. Таким образом, он сможет быть изменен любым потоком, и каждый доступ к нему будет иметь самое последнее значение. Также вы можете использовать эту переменную для управления поведением потока (например, остановить его, когда что-то скрывается в потоке основного приложения). – beastofman

Смежные вопросы