2014-10-26 2 views
0

Допустим, у меня есть поток, который ожидает пользователь, чтобы нажать на кнопку перед переходом:C# - Большинство ООП способ передачи данных между потоками

System.Threading.AutoResetEvent dialoguePause = new System.Threading.AutoResetEvent(false); 

public void AskQuestion() 
{ 
    /* buttons containing choices created here */ 

    dialoguePause.WaitOne(); 

    /*Code that handles choice here */ 
} 

public void Choice_Clicked(object sender, EventArgs e) 
{ 
    dialoguePause.Set(); 
} 

Как я могу передать данные из потока Choice_Clicked находится на AskQuestion, не полагаясь на переменные класса? Лучшее, что я могу сделать это:

System.Threading.AutoResetEvent dialoguePause = new System.Threading.AutoResetEvent(false); 
string mostRecentChoice; 


public void AskQuestion() 
{ 
    /* buttons containing choices created here */ 

    dialoguePause.WaitOne(); 

    MessageBox.Show("You chose " + mostRecentChoice + "."); 
} 

public void Choice_Clicked(object sender, EventArgs e) 
{ 
    mostRecentChoice = (sender as Button).Content.ToString(); //Ugly! 
    dialoguePause.Set(); 
} 
+0

Не используйте потоки, используйте шаблон Async задачи (async/await). Только запускайте новые потоки для длительных операций с привязкой к процессору. –

ответ

0

Есть много способов для достижения этой цели:

  • Используйте свойство в Singleton или Monostate. Всегда есть один экземпляр такого свойства, поэтому независимо от того, какой поток пишет и который читает, он будет делиться им, если они находятся в одном домене приложения.
  • Использование сообщения
  • Если вы в одном классе, использовать поле или свойство (обратите внимание на поперечные нити!)
  • ...

То, что я пытаюсь сказать, это зависит от приложение. У меня нет подсказки, если это WinForm, WPF или Web ...

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