我希望在这些问题中有足够的细节。
概述: 我的任务是从TCP流中获取数据并在gui上显示数据,并格式化数据并将其写入文件。我可以单独完成所有项目,但我遇到了将它们粘合在一起的问题。
在我的主要内容中,我调用了我的tcp_listener
MyTcpListener.start();
MyTcpListener不断循环并读取数据
public class MyTcpListener
{
//public string start(ref CQ.ConQueue init_concurrent_queue)
public static void start()
{
TcpListener server = null;
try
{
// Set the TcpListener on port 13000.
Int32 port = 13000;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
// TcpListener server = new TcpListener(port);
server = new TcpListener(localAddr, port);
// Start listening for client requests.
server.Start();
....
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
// Translate data bytes to a ASCII string.
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine("Received: {0}", data);
// !!! ADD DATA TO QUE HERE
Program.ConQueue
// Process the data sent by the client.
data = data.ToUpper();
byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
data.ToString();
// Send back a response.
stream.Write(msg, 0, msg.Length);
Console.WriteLine("Sent: {0}", data);
}
在上面的部分中,每当我获得新数据时,我都会将其写入控制台。但我需要做的是将它排入一个并发队列,我的另一个类可以将其从队列中出列并写入文件。
我应该怎么做? 我应该在main中创建对象并通过引用传递给我的其他线程/类吗?
或者有没有办法可以多次实例化对象,但只在内存中创建一个队列,所有对象都可以访问它?
答案 0 :(得分:4)
您应该将队列传递给对象
public string start(CQ.ConQueue queue)
我不确定该对象是什么,但.NET带有线程安全队列,ConcurrentQueue
有这样一种思考static
变量,无论你创建多少个类实例,它都只有一个实例。将它们用于您的问题类型是不可取的,因为它不是它们的意思,它隐藏了对象之间的队列共享,并且绝对阻止您拥有多个队列。
我注意到,你经过ref
这不是必需的。如果在C#中传递reference type,则有效地将指针传递给原始对象。通过ref
传递它有一个不同的,更复杂的含义(你通过引用传递指针),我不认为这是你的意图。
答案 1 :(得分:0)
使用ConcurrentQueue类。它包含多线程操作所需的功能。
信息:
https://msdn.microsoft.com/en-us/library/dd267265%28v=vs.110%29.aspx