当我坐在Console.ReadLine()上时,代表会运行吗?

时间:2012-01-24 18:31:45

标签: c# .net delegates

我对代表们非常陌生!

我有一个运行方法的AsyncCallback委托。

此方法定期将文本写入控制台(Console.WriteLine(“FooBar”))

这个委托从我的Main方法开始,我需要找到一种方法在委托运行时保持这个Main方法打开。否则,程序启动,启动委托并再次关闭,所以我使用Console.Readline。

这会有用吗?我的程序是否能够同时坐在Console.ReadLine上,而我的委托会定期使用Console.WriteLine将文本写入控制台,还是我是白痴?我的代码如下:

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'方法的不同版本每次都会在处理器上的单独线程上启动,或者正在运行的方法是否会停止并被替换最近的一个?

2 个答案:

答案 0 :(得分:4)

  

我的程序是否能够同时坐在Console.ReadLine上,而我的委托会定期使用Console.WriteLine将>文本写入控制台?

简答:是的

  

如果我用不同的方式多次调用'myNetworkStream.BeginRead'   参数将以我的'OnBeginRead'方法的不同版本开始   每次在处理器上的单独线程上或将该方法   正在运行停止并被更新的

替换

MSDN说这是多次调用BeginRead

  

读取和写入操作可以同时执行   不需要NetworkStream类的实例   同步。只要有一个唯一的写入线程   操作和一个唯一的线程用于读取操作,会有   读写线程之间没有交叉干扰,没有   同步是必需的。

这意味着您不应该从多个线程调用BeginRead。这将导致意外行为

答案 1 :(得分:2)

应该工作得很好。我做过几十次类似的事情。不用担心!