Будет ли делегат работать, пока я сижу на Console.ReadLine ()? - PullRequest
2 голосов
/ 24 января 2012

Я очень новичок в делегатах!

У меня есть делегат 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 ]

4 голосов
/ 24 января 2012

Моя программа сможет одновременно работать с Console.ReadLine, пока мой делегат периодически записывает> текст на консоль с помощью Console.WriteLine?

Краткий ответ: Да

если я вызову myNetworkStream.BeginRead несколько раз с разными параметрами, будет ли новая версия моего метода OnBeginRead запускаться каждый раз в отдельном потоке на процессоре или остановившийся метод будет заменен наболее свежая

MSDN говорит об этом несколько раз, вызывая BeginRead

Операции чтения и записи могут выполняться одновременно для экземпляра класса NetworkStream без необходимости синхронизации,Пока существует один уникальный поток для операций записи и один уникальный поток для операций чтения, не будет перекрестных помех между потоками чтения и записи и не требуется синхронизация.

Что подразумеваетчто вы не должны вызывать BeginRead из нескольких потоков.Это приведет к неожиданному поведению

2 голосов
/ 24 января 2012

Должно работать нормально.Я делал подобные вещи десятки раз.Не беспокойся!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...