Я не верю в это. Все операции пользовательского интерфейса должны выполняться в первичном потоке приложения, который известен как поток пользовательского интерфейса в приложении с графическим интерфейсом. Является ли это событием нажатия кнопки ; движение мыши; прокрутки; рисовать и т. д., включая окно перемещения, эти операции помещаются в очередь в очереди сообщений приложений (вроде буфера FIFO, который Windows поддерживает для всех приложений), который должен обрабатываться потоком пользовательского интерфейса.
Если, скажем, событие нажатия кнопки занимает много времени, потому что программист решил выполнить длительную операцию с базой данных в том же потоке, что и обратный вызов, то пользовательский интерфейс будет зависать до тех пор, пока обратный вызов не будет завершен, что является базой данных код.
Точно так же, если где-то в вашем коде потока пользовательского интерфейса у вас есть Thread.Sleep()
, то пользовательский интерфейс также будет зависать в течение того же периода.
Возможно, вы захотите рассмотреть возможность перемещения длинных операций в другой поток или . Пройдите простой и рекомендуемый путь и используйте async/await
. Это позволяет вам выполнять длительную операцию без блокировки пользовательского интерфейса.
Таймеры
Также рассмотрите возможность использования Timer
вместо Thread.Sleep()
или его эквивалента в качестве альтернативы перемещению окна 100 раз в секунду. Обязательно используйте правильный таймер для приложений с графическим интерфейсом, поскольку .NET определяет, по крайней мере, четыре (4) я считаю, и не все являются подходящими по умолчанию (если в все) для приложений с графическим интерфейсом .
Я имею работу вокруг, объявляю дополнительный класс, наследовавшийся Number<int>
класс. Этот класс теперь видим в C# и может быть инстанцирован.
public ref class MyInt32 : public Number<int>
{
};
Отражатель лежит немного здесь. Названием класса не является на самом деле Число <интервал>. Это - на самом деле 'Число <интервал>'. Заметьте одинарные кавычки. Они только видимы при просмотре имени типа с ildasm.
Я полагаю, что это сделано для создания типа несвязываемым на большинстве языков, поскольку у них нет способа понять, как на самом деле работает шаблон C++. Это делает его эффективно только видимым к компилятору C++, который является соответствующим, так как это - единственный компилятор MS, который на самом деле поддерживает шаблоны (шаблоны! = дженерики).
Если Ваша цель состоит в том, чтобы создать параметрический тип в C++ CLI и затем использовать тот тип от C#, я думаю, что необходимо создать универсальный тип, а не шаблонный тип (см. Блог Stan Lippman по причинам, почему оба метода существуют). Посмотрите здесь для получения информации о том, как создать универсальные типы в C++ CLI.