1

Тема: Поясніть за шаблони асинхронного програмування.

Здорів. Ну от я знаю, існує три шаблона. Це шаблон з використанням колбеків, з використанням подій, і з використанням якихось тасків. http://msdn.microsoft.com/ru-ru/library/jj152938.aspx Досі я використовував лише колбеки, тому що там все зрозуміло і прозоро. Перший метод запускає якийсь процес і працює в окремому потоці, а по закінченню роботи викликається інший метод, в котрий передається результат або будь-яка потрібна інформація. Ну тобто мона створити якийсь класс, позапихувати в нього купу інформації, при запуску асинхронного метода запихнути в нього той класс, а після закінчення роботи, викликається інший метод, в котрому ми отримуємо той самий класс і можемо робити з ним все, що захочемо. Оооот. А з подіями і тасками я нічо не зрозумів. Можете пояснити за ці два шаблона, на прикладі отримання інфи по сокету. Ну якщо це колбеки, то буде

Socket.BeginReceive(buffer,
                    0, buffer.Length, SocketFlags.None,
                    new AsyncCallback(ReceiveCallback),
                    data); // тут data - це якісь дані, включаючи сам сокет, а ReceiveCallback - метод, котрий викликається по закінченню виконання асинхронного метода.
 private void ReceiveCallback(IAsyncResult result)
            {
       
                Data data =
                (Data)result.AsyncState; //отримуємо дані
                    int bytesRead =
                    data.Socket.EndReceive(result); // отримуємо кількість прочитаних байт
}
                  

А ви поясніть, як це буде виглядати, якщо використовувати події або таски. Дякую :3

2

Re: Поясніть за шаблони асинхронного програмування.

ну кароч я почитав і подивився відео про async & await, прикільна така штука. Тре з нею більше розібратись, і переписати сервер с використанням цих штук.

3

Re: Поясніть за шаблони асинхронного програмування.

Млинець! Нічого не виходе. Хочу успадковати клас Socket, і додати метод, котрий буде асинхронно відправляти якісь дані, так воно пише - "Невозможно ожидание int"

Прихований текст

https://не-дійсний-домен/4j66p.png

\

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;

namespace AsyncServer
{
    class Program
    {
        class SuperSocket : Socket
        {
            public SuperSocket(AddressFamily addressFamily,SocketType socketType,ProtocolType protocolType):base(addressFamily,socketType,protocolType)
            {}

            public async Task SendTaskAsync(byte[] buff)
            {
              int i = (int)await this.Send(buff); // ???
            }
        }
        class AsyncServer
        {
            private SuperSocket socket;
            private byte[] buffer;

            public AsyncServer(int port, string ip)
            {
                buffer = new byte[1024];
                // Получаем информацию о локальном компьютере
                IPHostEntry localMachineInfo =
                    Dns.GetHostEntry(Dns.GetHostName());
                IPEndPoint myEndpoint = new IPEndPoint(IPAddress.Any, port);
                // Создаем сокет, привязываем его к адресу
                // и начинаем прослушивание
                socket = new SuperSocket(
                    myEndpoint.Address.AddressFamily,
                    SocketType.Stream, ProtocolType.Tcp);
                socket.Bind(myEndpoint);
                socket.Listen((int)
                    SocketOptionName.MaxConnections);
            }

            public async Task Send()
            {
                await socket.SendTaskAsync(new byte[10]);
            }

        }

        static void Main(string[] args)
        {
        }
    }
}

Якщо чесно, я вже не розумію, що я хочу зробити.

4 Востаннє редагувалося FakiNyan (04.09.2013 22:45:34)

Re: Поясніть за шаблони асинхронного програмування.

все ок, от така конструкція працює

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Mail;
using System.Net.Mime;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace experements
{
    
    class Program
    {

        static void Main()
        {
            Send("hello world");
            Console.WriteLine(0);
            Console.ReadLine();
        }

        static async void Send(string s)
        {
            int i = (int) await Method(s);
            Console.WriteLine(i);
        }

        static async Task<int> Method(string s)
        {
            await Task.Delay(1000);
            Console.WriteLine(s);
            return 1;
        }

    }
}

https://не-дійсний-домен/4j7WB.png
ну я тепер візьму її за основу, ну типу допомогає зрозуміти, як це працює, і напишу тоді сервер такий кароч

5 Востаннє редагувалося FakiNyan (05.09.2013 11:23:52)

Re: Поясніть за шаблони асинхронного програмування.

нєєєє хлопці. нічо не робить. от останя версія коду, Send не є асинхронним :с

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
 
namespace AsyncServer
{
    class Program
    {
        class SuperSocket : Socket
        {
            public SuperSocket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
                : base(addressFamily, socketType, protocolType)
            { }
 
            public async Task<int> SendTaskAsync(byte[] buff)
            {
                Thread.Sleep(1000);
                var t = await this.MySendAsync(buff);
                int i = (int) t;
                return i;
            }
            //***********************************
            private Task<int> MySendAsync(byte[] buff)
            {
                var _builder = new AsyncTaskMethodBuilder<int>();
 
                Action _moveNext = delegate
                {
                    try
                    {
 
                        //int i = this.Send(buff);
                        int i = 20;
                        _builder.SetResult(i);
 
                    }
 
                    catch (Exception exception)
                    {
                        _builder.SetException(exception);
                    }
                };
                _moveNext();
                return _builder.Task;
            }
            //***************************************
 
        }
        class AsyncServer
        {
            private SuperSocket socket;
            private byte[] buffer;
 
            public AsyncServer(int port)
            {
                buffer = new byte[1024];
                // Получаем информацию о локальном компьютере
                IPHostEntry localMachineInfo =
                    Dns.GetHostEntry(Dns.GetHostName());
                IPEndPoint myEndpoint = new IPEndPoint(IPAddress.Any, port);
                // Создаем сокет, привязываем его к адресу
                // и начинаем прослушивание
                socket = new SuperSocket(
                    myEndpoint.Address.AddressFamily,
                    SocketType.Stream, ProtocolType.Tcp);
                socket.Bind(myEndpoint);
                socket.Listen((int)
                    SocketOptionName.MaxConnections);
                Send(); // не має заморожувати потік
                Console.WriteLine("after send");  // має відображатись першим
            }
 
            public async Task Send()
            {
                int i = (int) await socket.SendTaskAsync(new byte[10]);
                Console.WriteLine(i);
            }
 
        }
 
        static void Main(string[] args)
        {
            AsyncServer server = new AsyncServer(9095);
            Console.Read();
        }
    }
}
 

Але ніфіга, прога чекає 1 секунду і відображає спочатку 20, а потім after send

6

Re: Поясніть за шаблони асинхронного програмування.

Прихований текст

і тут мені згадалась пісня, точніше, її назва:
General Lee - Alone with Everybody

Подякували: Chemist-i1

7

Re: Поясніть за шаблони асинхронного програмування.

Cyan написав:
Прихований текст

і тут мені згадалась пісня, точніше, її назва:
General Lee - Alone with Everybody

я вже звик