Socket.Send + Async & Await: свой асинхронный метод отправки данных - C#

Узнай цену своей работы

Формулировка задачи:

Привет. Хочу написать свой асинх. метод для отправки данных при помощи класса Socket и его метода Send. Работать должно так. Есть некий метод, в котором вызывается
Листинг программы
  1. socket.SendTaskAsync(byte[] data);
После этого должна начатся асинхронная отправка данных, то есть поток, в котором вызывался метод, не должен замораживатся после вызова этого метода, а должен выполнятся дальше. Раньше я писал такое при помощи Begin/End.Send и Callback метода, а терь хочу по моднявому, с использованием async & await. Сидел я над этим делом два дня целых, но так и не написал, то, что надо, в конце концов вообще запутался в своем коде, вот последняя версия
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Runtime.CompilerServices;
  7. using System.Runtime.Serialization;
  8. using System.Text;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11. namespace AsyncServer
  12. {
  13. class Program
  14. {
  15. class SuperSocket : Socket
  16. {
  17. public SuperSocket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
  18. : base(addressFamily, socketType, protocolType)
  19. { }
  20. public async Task<int> SendTaskAsync(byte[] buff)
  21. {
  22. Thread.Sleep(1000);
  23. var t = await this.MySendAsync(buff);
  24. int i = (int) t;
  25. return i;
  26. }
  27. //***********************************
  28. private Task<int> MySendAsync(byte[] buff)
  29. {
  30. var _builder = new AsyncTaskMethodBuilder<int>();
  31. Action _moveNext = delegate
  32. {
  33. try
  34. {
  35. //int i = this.Send(buff);
  36. int i = 20;
  37. _builder.SetResult(i);
  38. }
  39. catch (Exception exception)
  40. {
  41. _builder.SetException(exception);
  42. }
  43. };
  44. _moveNext();
  45. return _builder.Task;
  46. }
  47. //***************************************
  48. }
  49. class AsyncServer
  50. {
  51. private SuperSocket socket;
  52. private byte[] buffer;
  53. public AsyncServer(int port)
  54. {
  55. buffer = new byte[1024];
  56. // Получаем информацию о локальном компьютере
  57. IPHostEntry localMachineInfo =
  58. Dns.GetHostEntry(Dns.GetHostName());
  59. IPEndPoint myEndpoint = new IPEndPoint(IPAddress.Any, port);
  60. // Создаем сокет, привязываем его к адресу
  61. // и начинаем прослушивание
  62. socket = new SuperSocket(
  63. myEndpoint.Address.AddressFamily,
  64. SocketType.Stream, ProtocolType.Tcp);
  65. socket.Bind(myEndpoint);
  66. socket.Listen((int)
  67. SocketOptionName.MaxConnections);
  68. Send(); // не должен замораживать поток
  69. Console.WriteLine("after send"); // должно отображатся первым
  70. }
  71. public async Task Send()
  72. {
  73. int i = (int) await socket.SendTaskAsync(new byte[10]);
  74. Console.WriteLine(i);
  75. }
  76. }
  77. static void Main(string[] args)
  78. {
  79. AsyncServer server = new AsyncServer(9095);
  80. Console.Read();
  81. }
  82. }
  83. }
В методе SendTaskAsync вы можете видеть слип на 1 сек, это я спецом запилил, чтобы было ясно, работает ли Send, как мне надо. но нифига, после запуска проги, она ждет 1 сек, а потом выдает сначала "20", а потом "after send". Помогите плз разобратся, что я делаю не так???

Решение задачи: «Socket.Send + Async & Await: свой асинхронный метод отправки данных»

textual
Листинг программы
  1. using System;
  2. using System.Diagnostics;
  3. using System.Net;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6.  
  7. namespace ConsoleApplication8
  8. {
  9.     class Program
  10.     {
  11.         async static void AsyncVersion()
  12.         {
  13.             Stopwatch sw = Stopwatch.StartNew();
  14.             string url1 = "http://rsdn.ru";
  15.             string url2 = "http://gotdotnet.ru";
  16.             string url3 = "http://blogs.msdn.com";
  17.  
  18.             var webRequest1 = WebRequest.Create(url1);
  19.             Console.WriteLine("Before webRequest1.GetResponseAsync(). Thread Id: {0}",
  20.                 Thread.CurrentThread.ManagedThreadId);
  21.  
  22.             var webResponse1 = await webRequest1.GetResponseAsync();
  23.             Console.WriteLine("{0} : {1}, elapsed {2}ms. Thread Id: {3}", url1,
  24.                 webResponse1.ContentLength, sw.ElapsedMilliseconds,
  25.                 Thread.CurrentThread.ManagedThreadId);
  26.  
  27.             var webRequest2 = WebRequest.Create(url2);
  28.             Console.WriteLine("Before webRequest2.GetResponseAsync(). Thread Id: {0}",
  29.                 Thread.CurrentThread.ManagedThreadId);
  30.  
  31.             var webResponse2 = await webRequest2.GetResponseAsync();
  32.             Console.WriteLine("{0} : {1}, elapsed {2}ms. Thread Id: {3}", url2,
  33.                 webResponse2.ContentLength, sw.ElapsedMilliseconds,
  34.                 Thread.CurrentThread.ManagedThreadId);
  35.  
  36.             var webRequest3 = WebRequest.Create(url3);
  37.             Console.WriteLine("Before webRequest3.GetResponseAsync(). Thread Id: {0}",
  38.                 Thread.CurrentThread.ManagedThreadId);
  39.             var webResponse3 = await webRequest3.GetResponseAsync();
  40.             Console.WriteLine("{0} : {1}, elapsed {2}ms. Thread Id: {3}", url3,
  41.                 webResponse3.ContentLength, sw.ElapsedMilliseconds,
  42.                 Thread.CurrentThread.ManagedThreadId);
  43.         }
  44.         static void Main(string[] args)
  45.         {
  46.  
  47.             try
  48.             {
  49.                 Console.WriteLine("Main thread id: {0}", Thread.CurrentThread.ManagedThreadId);
  50.                 Task task = new Task(AsyncVersion);
  51.                 task.Start();
  52.                 Console.WriteLine("Right after AsyncVersion() method call");
  53.                 //Ожидаем завершения асинхронной операции
  54.                 task.Wait();
  55.                 Console.WriteLine("Asyncronous task finished!");
  56.  
  57.             }
  58.             catch (System.AggregateException e)
  59.             {
  60.                 //Все исключения в TPL пробрасываются обернутые в AggregateException
  61.                 Console.WriteLine("AggregateException: {0}", e.InnerException.Message);
  62.             }
  63.             Console.ReadLine();
  64.         }
  65.     }
  66. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы