当我坐在Console.ReadLine()上时,代理会运行吗
本文关键字:上时 代理 运行 Console ReadLine | 更新日期: 2023-09-27 18:21:30
我对代表们非常陌生!
我有一个AsyncCallback委托,它运行一个方法。
此方法定期将文本写入控制台(console.WriteLine("FooBar"))
这个委托是从我的Main方法中启动的,我需要找到一种方法,在委托运行时保持这个Main方法的打开状态。否则,程序启动,启动代理并再次关闭,所以我使用Console.Readline.
这行得通吗?当我的代理定期使用Console.WriteLine向控制台写入文本时,我的程序是否能够同时位于Console.ReadLine?还是我是个白痴?我的代码如下:
static void Main(string[] args)
{
NetworkStream myNetworkStream;
Socket socket;
IPEndPoint maxPort = new IPEndPoint(IPAddress.Parse("x.x.x.x"), xxxx);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
socket.Connect(maxPort);
myNetworkStream = new NetworkStream(socket);
byte[] buffer = new byte[1024];
int offset = 0;
int count = 1024;
string loginString = "FOOBARR";
ASCIIEncoding encoder = new ASCIIEncoding();
myNetworkStream.BeginRead(buffer, offset, count, new AsyncCallback(OnBeginRead), myNetworkStream);
myNetworkStream.Write(encoder.GetBytes(loginString), 0, encoder.GetByteCount(loginString));
Console.ReadLine();
}
public static void OnBeginRead(IAsyncResult ar)
{
NetworkStream ns = (NetworkStream)ar.AsyncState;
int bufferSize = 2014;
byte[] received = new byte[bufferSize];
string result = String.Empty;
ns.EndRead(ar);
int read;
while (true)
{
if (ns.DataAvailable)
{
read = ns.Read(received, 0, bufferSize);
result += Encoding.ASCII.GetString(received);
received = new byte[bufferSize];
Console.WriteLine(result);
}
else
{
Thread.Sleep(1000);
}
}
}
此外,如果我用不同的参数多次调用"myNetworkStream.BeginRead",我的"OnBeginRead"方法的不同版本每次都会在处理器上的一个单独线程上启动吗?还是正在运行的方法会停止并被最近的方法取代?
当我的代理使用Console.WriteLine定期向控制台写入>文本时,我的程序是否能够同时位于Console.ReadLine?
简短回答:是
如果我多次使用不同的参数将启动不同版本的"OnBeginRead"方法每次在处理器上的一个单独的线程上,或者将方法正在运行的停止并被最近的取代
MSDN说多次调用BeginRead
可以在NetworkStream类的实例,而不需要同步。只要有一个用于写入的唯一线程操作和一个用于读取操作的唯一线程读线程和写线程之间没有交叉干扰需要同步。
这意味着您不应该从多个线程调用BeginRead
。这将导致的意外行为
应该可以正常工作。类似的事情我已经做了几十次了。不用担心!