Разница между [& hellip;] Async и Begin [& hellip;] .net асинхронными API

Алгоритм:

  • Подсчитайте от 1 до 2 ^ n.
  • Преобразуйте каждую цифру в ее двоичное представление.
  • бит в элементы вашего набора, в зависимости от положения.

В C #:

void Main()
{
    var set = new [] {"A", "B", "C", "D" }; //, "E", "F", "G", "H", "I", "J" };

    var kElement = 2;

    for(var i = 1; i < Math.Pow(2, set.Length); i++) {
        var result = Convert.ToString(i, 2).PadLeft(set.Length, '0');
        var cnt = Regex.Matches(Regex.Escape(result),  "1").Count; 
        if (cnt == kElement) {
            for(int j = 0; j < set.Length; j++)
                if ( Char.GetNumericValue(result[j]) == 1)
                    Console.Write(set[j]);
            Console.WriteLine();
        }
    }
}

Почему это работает?

биекция между подмножествами n-элементного множества и n-битовых последовательностей.

Это означает, что мы можем выяснить, сколько подмножеств существует путем подсчета последовательностей.

, например, четыре приведенных ниже элемента могут быть представлены {0,1} X {0, 1} X {0, 1} X {0, 1} (или 2 ^ 4) различными последовательностями.

Итак, все, что нам нужно сделать, это считать от 1 до 2 ^ n, чтобы найти все комбинации. (Мы игнорируем пустое множество.) Затем переведите цифры в их двоичное представление. Затем замените элементы вашего набора на биты «on».

Если вы хотите получить только результаты k-элемента, только распечатывайте, когда k бит «включено».

(Если вы хотите, чтобы все подмножества вместо подмножеств k длины удаляли часть cnt / kElement.)

(Для доказательства см. бесплатную учебную программу MIT Mathematics for Computer Science, Lehman et al. , раздел 11.2.2. https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-042j-mathematics-for-computer-science-fall-2010/readings/ )

16
задан Matthew Scharley 20 June 2010 в 21:56
поделиться

2 ответа

MSDN ответит что лучше меня:

http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx

Основная особенность этих улучшений избегание повторения выделение и синхронизация объекты во время большой громкости асинхронный ввод-вывод сокетов. Начало / Конец шаблон проектирования, реализованный в настоящее время классом System.Net.Sockets.Socket требуется объект System.IAsyncResult выделяться для каждого асинхронного работа с сокетом.

11
ответ дан 30 November 2019 в 21:10
поделиться

Обратите внимание, что большинство методов * Async (с соответствующими событиями * Completed ) используют Асинхронный шаблон на основе событий . Более старый (но все еще действующий) Begin * и End * - это шаблон, называемый моделью асинхронного программирования . Класс Socket является исключением из этого правила; его методы * Async не имеют соответствующих событий; по сути, это просто APM, созданный таким образом, чтобы избежать чрезмерного выделения памяти.

Самая большая разница между APM и EBAP - это поток, используемый для уведомления о завершении. APM обратится к потоку пула потоков (если запрос не завершится синхронно). EBAP будет использовать кросс-платформенную стратегию для обратного вызова потока пользовательского интерфейса (если операция была запущена из потока пользовательского интерфейса).

Однако и APM, и EBAP заменяются гораздо более гибким подходом, основанным на библиотеке параллельных задач . Поскольку TPL может легко оборачивать APM, старые классы, скорее всего, не будут обновляться напрямую; методы расширения используются для обеспечения эквивалентов Задачи для старых методов APM.

Обновление 2012-07-14: Я был неправ, когда заявил, что «старые классы, скорее всего, не будут обновляться напрямую». По соображениям производительности команды BCL / TPL решили проверить каждый тип BCL и добавить методы TAP напрямую вместо использования методов расширения. Эти изменения будут в .NET 4.5.

17
ответ дан 30 November 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: