110,534
社区成员
发帖
与我相关
我的任务
分享
public class MessageEventWaitHandle<T> : EventWaitHandle
{
private T message;
public MessageEventWaitHandle(bool initialState, EventResetMode mode) : base(initialState, mode)
{
}
public bool Set(T message)
{
this.message = message;
return base.Set();
}
public T GetMessage()
{
return this.message;
}
}
不用谢,高兴的话,赏点分!!!
class Program
{
static void Main(string[] args)
{
var 消息中心 = new 消息处理中心();
消息中心.开始();
ThreadPool.QueueUserWorkItem(o =>
{
while (true) { Thread.Sleep(1000); 消息中心.添加消息(DateTime.Now.ToLongTimeString()); }
});
ThreadPool.QueueUserWorkItem(o =>
{
while (true) { Thread.Sleep(2500); 消息中心.添加消息(DateTime.Now.ToString()); }
});
Console.ReadLine();
}
}
class 消息处理中心
{
BlockingCollection<string> 消息队列;
public void 开始()
{
var tmp = new BlockingCollection<string>(new ConcurrentQueue<string>());
if (Interlocked.CompareExchange(ref 消息队列, tmp, null) == null)
{
ThreadPool.QueueUserWorkItem(消息处理循环);
}
}
public void 添加消息(string message)
{
if (消息队列 == null) throw new InvalidCastException("MessageProcessor not yet started.");
消息队列.TryAdd(message);
}
void 消息处理循环(object state)
{
foreach(string message in 消息队列.GetConsumingEnumerable())
{
Console.WriteLine(message);
}
}
}
lock (container)
去掉,看看及时想去判断 if (j > 最后显示的数据)
则冲突也确实会发生,那么这时候就仅仅在最必要的几条语句放到 lock {.....} 语句块里边,保证同一时间只有一个线程能进入这个代码块(也就是排队等待了),就可以了。
写一条同步语句就行了。不用自己发明什么复杂的结构。