Использование реального мира пользовательских атрибутов.NET

Подводя итог (как было сказано в предыдущих ответах):

В JavaScript нет встроенной функции сна. Вы должны использовать setTimeout или setInterval для достижения аналогичного эффекта.

Если бы вы действительно хотели, вы могли бы смоделировать режим сна с помощью цикла for, подобного показанному в исходном вопросе, но это сделало бы ваш процессор сумасшедшим. Внутри Web Worker альтернативным решением было бы сделать синхронный XMLHttpRequest с неотвечающим IP и установить правильный таймаут. Это позволит избежать проблемы использования процессора. Вот пример кода:

// Works only inside a web worker

function sleep(milliseconds) {
	var req = new XMLHttpRequest();
	req.open("GET", "http://192.0.2.0/", false);
	req.timeout = milliseconds;
	try {
		req.send();
	} catch (ex) {
		
	}
}

console.log('Sleeping for 1 second...');
sleep(1000);
console.log('Slept!');

console.log('Sleeping for 5 seconds...')
sleep(5000);
console.log('Slept!');

8
задан Deduplicator 31 January 2015 в 15:31
поделиться

7 ответов

I ' Я использовал их «настраиваемые» атрибуты для проверки (например, пометку поля для проверки с помощью моей собственной «проверки кредитной карты») и пользовательские анализаторы LinqToLucene, которые я написал (например, указание, какой анализатор использовать в данном поле).

Код проверки, например, будет выглядеть примерно так:

public class Customer
{
     [CreditCardValidator]
     string creditCardNumber;

     [AddressValidator]
     string addressLineOne
}

Когда объект выше проверяется, каждое поле проверяется соответствующим валидатором благодаря атрибуту «custom».

В материале LinqToLucene I ' Написанные настраиваемые атрибуты хороши тем, что позволяют находить (посредством отражения) определенные поля во время выполнения. Например, если у вас есть объект клиента,

4
ответ дан 5 December 2019 в 17:40
поделиться

Я создал движок сценариев и пометил различные методы атрибутом [Command]. Это означало, что эти функции были доступны механизму создания сценариев.

Пример:

[Command(HelpText = "Lists active users")]
void ListUsers(void)
{

}

[Command(HelpText = "Terminate a specific user's connection")]
void EndConnection(int userID)
{

}

И как использовалось:

MyScriptEngine>>  Help
Available Commands are:
    ListUsers: Lists active users
    EndConnection {userID}: Terminate a specific user's connection

MyScriptEngine>> EndConnection 3
    User 3 (Michael) has had his connection terminated.

MyScriptEngine>>
5
ответ дан 5 December 2019 в 17:40
поделиться

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

0
ответ дан 5 December 2019 в 17:40
поделиться

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

0
ответ дан 5 December 2019 в 17:40
поделиться

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

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

Например, у меня может быть перечисление для состояния объекта. Исходя из этого состояния, у меня может быть 3 или 4 разных места в коде, которые я бы сделал «переключением» этого перечисления и выполнил некоторую операцию. Другой разработчик может легко внести ошибку, добавив новое перечисление, но не обрабатывая его в одном из операторов switch в другом месте кода.

Чтобы избежать этого, я создаю настраиваемые атрибуты, объявленные для статического класса. Настраиваемые атрибуты загружаются в статический конструктор класса в словарь, и все места в коде используют словарь вместо операторов switch. Конструктор настраиваемых атрибутов содержит «жестко запрограммированные» значения для каждого оператора switch.

1
ответ дан 5 December 2019 в 17:40
поделиться

Я использовал его в одном из фреймворков ORM, которые я разработал на основе шаблона ActiveRecord. Это тот же тип реализации, который доступен в LINQ, проекте Castle и т. Д.

Фреймворк назывался «SkyFramework», но он не был открытым исходным кодом.

например, Просто примерный пример ...

Вы найдет аналогичные примеры и в других проектах с открытым исходным кодом.

[Sky.Table ("user")]
public class User
{
    [Sky.Column ("username")]
    public string UserName;

    [Sky.Column ("pwd")]
    public string Password;
}

ПРИМЕЧАНИЕ. Атрибуты «Таблица», «Столбцы» в то время были настраиваемыми атрибутами.

Механизм ActiveRecord анализирует объект на предмет этих атрибутов и генерирует соответствующие функции для CRUD ... и т.д ...

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

[Sky.BenchMark()]
public void LongRunningMethod(..)
{
}

Методы, отмеченные указанными выше атрибутами, автоматически маркируются эталонным тестом, и создается журнал. Это были некоторые более ранние реализации.

По этой теме доступна книга Apress .. Прикладные атрибуты .NET , которые могут вам помочь.

0
ответ дан 5 December 2019 в 17:40
поделиться

Я разместил настраиваемые атрибуты в классах в «подключаемых» библиотеках DLL. Это позволяет фреймворку динамически обнаруживать доступные плагины, оценивать, представляют ли они интерес, а затем динамически загружать интересующие.

В нашей области примером являются плагины, моделирующие конкретные автомобили в семействе. Один плагин для семейства автомобилей может фактически моделировать несколько моделей автомобилей в семействе автомобилей (например, «MX-6», «Probe»). Если идентификатор или название модели включены в качестве массива настраиваемых атрибутов, мы можем быстро игнорировать любые библиотеки DLL, которые даже не имеют настраиваемых атрибутов, а затем игнорировать любые, которые не моделируют интересующий автомобиль.

0
ответ дан 5 December 2019 в 17:40
поделиться
Другие вопросы по тегам:

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