C# начинаются* () метод по сравнению с пулом потоков для сервера

Вот простое решение вашей проблемы. Я оставлю это вам, чтобы изменить и сделать так, чтобы он выглядел и работал именно так, как вы хотите:)

Изучение языка kv НЕВЕРОЯТНО полезно, легко и его можно довольно быстро освоить.

main.py

from kivy.app import App

class MainApp(App):
    alphabet = 'abcdefghijklmnopqrstuvwxyz'

    def next_letter(self):
        # Get a reference to the widget that shows the letters
        # self.root refers to the root widget of the kv file -- in this case,
        # the GridLayout
        current_letter_widget = self.root.ids['the_letter_label']
        # Get the letter currently shown
        current_letter = current_letter_widget.text
        # Find the next letter in the alphabet
        next_letter_index = self.alphabet.find(current_letter) + 1
        next_letter = self.alphabet[next_letter_index]

        # Set the new letter in the widget that shows the letters
        current_letter_widget.text = next_letter

MainApp().run()

main.kv

GridLayout: # This is the `root` widget of the main app class
    cols: 1
    Label:
        text: "g"
        id: the_letter_label # Setting an id for a widget lets you refer to it later
    Button:
        text: "Previous"
    Button:
        text: "Next"
        on_release:
            # the keyword `app` references the main app class, so we can call
            # the `next_letter` function
            app.next_letter()

Я с удовольствием отвечу на конкретные вопросы, если они у вас есть.

5
задан ryeguy 20 February 2009 в 17:13
поделиться

5 ответов

Если масштабируемым, Вы имеете в виду действительно большие количества соединений, необходимо также рассмотреть много других аспектов вне использования пула потоков.

1) Если Вы используете.NET3.5, рассматриваете SocketAsyncEventArgs, а не BeginXXX/EndXXX. Подход описан в MSDN Magazine. Они допускают более эффективную отправку и обработку базового асинхронного i/o.

2) Рассмотрите свое использование памяти очень тщательно. Байт [] буферы, выделенные для асинхронного i/o, прикрепляются, вынуждая GC работать вокруг них во время фазы уплотнения, которая в свою очередь может привести к фрагментации и OutOfMemoryExceptions при загрузке. Кроме того, Вы имеете, рассматривают собственные проблемы низшего уровня асинхронного i/o, такие как доступная память в пуле неподкачиваемой памяти.

Некоторые доступные методы используют единственный общий буфер нулевого байта для всего ожидания, получает, и использование объединенных в пул буферов (из памяти, который не делает уплотненный - или LOH или собственная "куча") для ввода-вывода, который на самом деле передаст данные.

2
ответ дан 14 December 2019 в 04:48
поделиться

Относительно Вашего редактирования начните/закончите, вызовы обычно не будут порождать поток. Это - в значительной степени причина, они существуют. Они позволяют Вам запускать операцию, которая, как ожидают, будет работать асинхронно самым эффективным доступным способом. Для сокетов, почему это должно породить поток? ОС уведомит Вас, когда что-то произойдет на сокете, таким образом, нет никакой потребности в потоке для брожения вокруг слушания также.

1
ответ дан 14 December 2019 в 04:48
поделиться

Лучший подход может быть должен использовать AsyncEnumerator Jeffery Richter. Это - часть Библиотеки Wintellect PowerThreading. Можно смотреть видеопрезентацию того, как она работает на Канале 9.

Я использую его в двух проектах, и большая вещь об этом состоит в том, что это позволяет Вам совместно использовать ограниченные ресурсы пула потоков через многие запросы, таким образом, это не связывает потоки для каждого запроса. Вы получаете лучший из обоих миров.

1
ответ дан 14 December 2019 в 04:48
поделиться

Реализация TcpServer будет лучше, когда она собирается использовать в своих интересах порты завершения ввода-вывода для выполнения асинхронной работы, в то время как реализация пула потоков обычно оказывается перед необходимостью записывать поток для ожидания на соединениях, которые принимаются.

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

4
ответ дан 14 December 2019 в 04:48
поделиться

Я предпочитаю пул потоков, поскольку он помогает мне управлять количеством потока, который я ограничиваю на системном уровне.

Вы должны разъяснить то, что Вы подразумеваете под эффективностью:

  1. Меньше памяти
  2. скорость
  3. Время отклика / пропускная способность

необходимо принять решение с помощью

  1. Среднее число пользователей, использующих программу
  2. оборудование

Сгладьте фундаментальные требования сначала прежде, чем прыгнуть в проектные решения.

0
ответ дан 14 December 2019 в 04:48
поделиться
Другие вопросы по тегам:

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