从其他线程获取用户输入

时间:2019-05-09 18:20:04

标签: c# multithreading

我正在运行具有两个线程(主线程和另一个线程)的控制台应用程序。另一个线程在某个时间执行(我已经使用过Timer)。在这两个线程中,我都希望用户输入例如主线程=>给我您的名字子线程=>给我您的年龄。我要做的就是在执行子线程时不要弄乱主线程的用户输入,因此在从子线程完成操作(获取用户输入)后,再从主线程获取用户输入。当我执行此代码并准备在主线程中输入名称时,子线程将执行并提示输入年龄。当我输入内容时,此输入将保存到主线程中的名称。 这是我的代码

using System;
using System.Threading;

static class ThreadSafe
{
  private static Timer timer;
  static readonly object locker = new object();

  static void Main()
  {
      new Thread(() => SetUpTimer(
         new TimeSpan(20, 07,
             50))).Start();
      Console.WriteLine("give me your name");
      string a = Console.ReadLine();
      Console.WriteLine(a);
  }

  static void SetUpTimer(TimeSpan alertTime)
  {
      DateTime current = DateTime.Now;
      TimeSpan timeToGo = alertTime - 
       current.TimeOfDay;
      if (timeToGo >= TimeSpan.Zero)
      {
          timer = new Timer(x => { askNow(2); }, 
          null, timeToGo,
          Timeout.InfiniteTimeSpan);
      }
  }

  static void askNow(int id)
  {
      lock (locker)
      {

          Console.WriteLine("give me your age");
          string b = Console.ReadLine();
          Console.WriteLine(b + "b");
      }
    }
 }

1 个答案:

答案 0 :(得分:0)

单个lock不会帮助您进行同步。您需要锁定所有同步代码位,这意味着您需要在同一对象上至少拥有两个锁。为了避免在您的特定情况下造成干扰,请修改main:

static void Main()
{
  new Thread(() => SetUpTimer(
     new TimeSpan(20, 07,
         50))).Start();
  lock (locker)
  {
    Console.WriteLine("give me your name");
    string a = Console.ReadLine();
    Console.WriteLine(a);
  }
}

还请注意,您希望锁定时间尽可能短。在您的情况下,您在等待用户输入时会锁定,这通常是个坏主意。