我对C#和多线程编程有点新意,但这里有:
我正在开发一个系统,在那里我将有一个将被实例化的类,然后等待来自另一个正在运行的类的各种消息。我应该如何捕捉和发送这些消息?
谢谢,
PM
答案 0 :(得分:4)
答案 1 :(得分:3)
如果您没有使用.net远程处理来在不同的appdomains之间发送对象。
简单的情节:
1-创建主类的单例对象。
2-使用Event和Delegate在类之间发送消息。
如果您需要在Appdomains之间发送消息。
1-如果Appdomain不跨越机器边界而不是使用IPC通道(.Net 2.0及更高版本)
2- IF Appdomain跨越机器边界,你可以使用.net远程处理。
答案 2 :(得分:2)
使用生产者/消费者队列。 .NET 4.0中有一个默认实现,网上有许多示例实现。根据您描述的内容,您想要的是单生产者/单一消费者队列。
一般情况下,一个线程被视为生产者并将消息写入队列。一个单独的线程(称为使用者线程)正在等待空闲,以便在队列中显示消息。这些线程如何相互协作(或不相互协作)的同步细节取决于实现。
答案 3 :(得分:2)
如果你使用的是.Net 3.5,请在一个单独的线程中运行你的发送者,并从监听器传递一个回调方法:
class Program
{
static void Main(string[] args)
{
Listener listener = new Listener();
Sender sender = new Sender();
sender.Send = new TalkDelegate(listener.TalkToMe);
Thread thread = new Thread(sender.Run);
thread.IsBackground = true;
thread.Start();
listener.Listen();
}
}
delegate bool TalkDelegate(string messageArg);
class Listener
{
bool keepListening = true;
public bool TalkToMe(string messageArg)
{
Console.WriteLine(messageArg);
return keepListening;
}
public void Listen()
{
DateTime startTime = DateTime.Now;
while ((DateTime.Now - startTime) < TimeSpan.FromSeconds(10))
{
Thread.Sleep(100);
}
keepListening = false;
}
}
class Sender
{
public TalkDelegate Send;
public void Run()
{
bool keepTalking = true;
while (keepTalking)
{
keepTalking = Send(DateTime.Now.ToString("HH:mm:ss"));
Thread.Sleep(1000);
}
}
}