Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我坐在Console.ReadLine()上时,代理是否会运行?_C#_.net_Delegates - Fatal编程技术网

C# 当我坐在Console.ReadLine()上时,代理是否会运行?

C# 当我坐在Console.ReadLine()上时,代理是否会运行?,c#,.net,delegates,C#,.net,Delegates,我对代表们来说是非常非常新的 我有一个AsyncCallback委托,它运行一个方法 此方法定期将文本写入控制台(console.WriteLine(“FooBar”)) 此委托是从我的主方法启动的,我需要找到一种方法,在委托运行时保持此主方法处于打开状态。否则,程序将启动、启动代理并再次关闭,因此我将使用Console.Readline 这样行吗?当我的代理使用Console.WriteLine定期向控制台写入文本时,我的程序是否能够同时位于Console.ReadLine,还是我是一个白痴?

我对代表们来说是非常非常新的

我有一个AsyncCallback委托,它运行一个方法

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

此委托是从我的主方法启动的,我需要找到一种方法,在委托运行时保持此主方法处于打开状态。否则,程序将启动、启动代理并再次关闭,因此我将使用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
。这将导致意外行为

应该可以正常工作。我做过几十次类似的事情。别担心