我正在运行具有两个线程(主线程和另一个线程)的控制台应用程序。另一个线程在某个时间执行(我已经使用过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");
}
}
}
答案 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);
}
}
还请注意,您希望锁定时间尽可能短。在您的情况下,您在等待用户输入时会锁定,这通常是个坏主意。