Условный вход/трассировка C#

Поскольку это асинхронный, у вас есть несколько вариантов. Основным является использование обратного вызова:

function createUniqueKey (arg1, arg2, callback) {
  $.post("/ajax/documents.php", {arg_1: arg1, arg_2 : arg2}, function(data){
    console.log(data) //Good result
    callback(data);
  }, "text");
}

$('#btn').click(function() {
  createUniqueKey(arg1, arg2, function(uniqueKey){
      console.log(uniqueKey);
  })      
});

Другой вариант - выяснить, как реализовать его как Promise или использовать функции Async:

function createUniqueKey (arg1, arg2) {
    return new Promise(function(resolve, reject) {
        $.post("/ajax/documents.php", {arg_1: arg1, arg_2 : arg2}, function(data){
            console.log(data) //Good result
            resolve(data);
          }, "text");
    })

}

$('#btn').click(function() {
  createUniqueKey(arg1, arg2).then(function(uniqueKey) {
    console.log(uniqueKey);
  })
});

. Обратный вызов .click эквивалентно этому

$('#btn').click(async function() {
  var uniqueKey = await createUniqueKey(arg1, arg2);
  console.log(uniqueKey);
});
8
задан Carlos A. Ibarra 17 February 2009 в 05:09
поделиться

9 ответов

Два из этих ответов (Andrew Arnott и Brian) действительно отвечали на часть моего вопроса. ConditionalAttribute, который применяется к методам класса Трассировки и Отладки, заставляет все вызовы к методам быть удаленными, если ТРАССИРОВКА или ОТЛАДКА являются #undef'd, включая дорогую оценку параметра.Спасибо!

Для второй части, можно ли полностью удалить, все заходит во время выполнения, не во время компиляции, я нашел ответ в log4net fac. Согласно им при установке свойства только для чтения во время запуска время выполнения скомпилирует далеко все вызовы, которые не проходят тест! Это не позволяет Вам изменить его после запуска, но это прекрасно, это лучше, чем удаление их во время компиляции.

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

Решение, которое работало на меня, использует singleton-класс. Это может выставить Ваши функции входа, и можно управлять его поведением эффективно. Позволяет называют класс 'AppLogger'. Ее пример

public class AppLogger
{
   public void WriteLine(String format, params object[] args)
    {
        if ( LoggingEnabled )
        {
            Console.WriteLine( format, args );
        }
    }
}

Отметьте, материал Singleton оставляют из вышеупомянутого примера. Существуют ТОННЫ хороших примеров трубы. ТЕПЕРЬ интересная вещь состоит в том, как поддерживать многопоточность. Я сделал это как это: (сокращенный для краткости, ха-ха-ха-ха)

public static void WriteLine( String format, params object[] args )
{
    if ( TheInstance != null )
    {
        TheInstance.TheCreatingThreadDispatcher.BeginInvoke(  Instance.WriteLine_Signal, format, args );
    }
}

Таким образом любой поток может зарегистрироваться, и сообщения обрабатываются на исходном потоке создания. Или Вы могли создать специальный поток только для обработки вывода входа.

2
ответ дан 5 December 2019 в 10:05
поделиться

Отвечать на один из Ваших вопросов, все вызовы метода, которые должны оценить чтобы к трассировке вызовов. WriteLine (или его одноуровневые элементы/кузены) не становятся названными если Трассировка. WriteLine компилируется. Так идут вперед и вставленный в Ваши дорогие вызовы метода непосредственно как параметры к вызову Трассировки, и он будет удален во время компиляции, если Вы не определите символ ТРАССИРОВКИ.

Теперь для Вашего другого вопроса относительно изменения Вашего многословия во времени выполнения. Прием здесь является той Трассировкой. WriteLine и похожие методы берут 'объект параметрических усилителей [] аргументы для их строковых аргументов форматирования. Только то, когда строка на самом деле испускается (когда многословие установлено достаточно высоко), делает вызов метода ToString на тех объектах вытащить строку из них. Таким образом, прием, который я часто играю, должен передать объекты, а не полностью собранные строки к этим методам, и оставить строковое создание в ToString объекта, в котором я передаю. Тем путем налог на производительность во время выполнения только заплачен, когда вход на самом деле происходит, и он дает Вам свободу изменить многословие, не перекомпилировав Ваше приложение.

9
ответ дан 5 December 2019 в 10:05
поделиться

Вы попробовали сложный API входа как log4net (http://logging.apache.org/log4net/index.html)?

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

ConditionalAttribute является Вашим лучшим другом. Вызов будет полностью удален (как будто сайты вызова были #if'd), когда #define не установлен.

Править: кто-то поместил это в комментарий (Спасибо!), но стоящий замечания в основном теле ответа:

Все методы класса Трассировки украшены Условным выражением ("ТРАССИРОВКА"). Просто видел этот отражатель использования.

Что означает Трассировку. Вздор (... дорогой...) полностью исчезает, если ТРАССИРОВКА не определяется.

2
ответ дан 5 December 2019 в 10:05
поделиться

Для Вашего комментария

"потому что я не могу выполнить тот большой ужасный вызов, похожи на мой простой ВИДЕОБЛОГ () вызов в C++" - Вы могли добавить оператор использования как пример ниже.

using System.Diagnostics;

....
Trace.WriteLineIf(.....)

Как я понимаю, это удалит строки, содержащие Трассировку при неопределении символа Трассировки.

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

Я не уверен, но можно узнать ответ сами.

Сделайте это ДЕЙСТВИТЕЛЬНО дорогой функцией (как Thread.Sleep(10000)) и время вызов. Если требуется очень долгое время, то это вызывает Вашу функцию так или иначе.

(Можно перенестись Trace.WriteLineIf() звоните с #if TRACE и #endif и протестируйте его снова на основное сравнение.)

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

Это вызовет дорогой вызов, потому что это могло бы иметь побочные эффекты, которые желаемы.

То, что можно сделать, украшают дорогой метод [Условное выражение ("ТРАССИРОВКА")] или [Условное выражение ("ОТЛАДКА")] атрибут. Метод не будет скомпилирован в заключительный исполняемый файл, если ОТЛАДКА или постоянная ТРАССИРОВКА не будут определены, ни будут любые вызовы для выполнения дорогого метода.

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

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

Если вы используете TraceSource (который, я считаю, вам следует использовать, а не вызывать Trace напрямую, потому что он дает вам более детальный контроль над трассировкой на уровне компонентов во время выполнения), вы можете сделать что-то вроде этого:

if (Component1TraceSource.ShouldTrace(TraceEventType.Verbose))
     OutputExpensiveTraceInformation()

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

Преимущество этого подхода заключается в том, что JITer компилируется для каждой функции по мере необходимости. Если "if" принимает значение false, функция не только не будет вызываться - она ​​даже не будет JITed. Обратной стороной является (а) вы разделили знания об уровне трассировки между этим вызовом и функцией OutputExicingTraceInformation (поэтому, если вы, например, измените TraceEventType на TraceEventType.Information, например, это не сработает, потому что вы никогда не даже вызовите его, если TraceSource не включен для трассировки на уровне подробностей в этом примере) и (б) это больше кода для написания.

Это тот случай, когда может показаться, что препроцессор, подобный C, может помочь (поскольку он может гарантировать, например, что параметр для ShouldTrace и возможный вызов TraceEvent одинаковы), но я понимаю, почему C # не включает это.

Предложение Эндрю изолировать дорогостоящие операции в.Методы ToString объектов, которые вы передаете в TraceEvent, также подойдут; в этом случае вы могли бы, например, разработать объект, который используется только для Trace, которому вы передаете объекты, которые хотите построить дорогостоящее строковое представление, и изолировать этот код в методе ToString объекта трассировки, а не делать это в список параметров для вызова TraceEvent (что приведет к его выполнению, даже если TraceLevel не включен во время выполнения).

Надеюсь, это поможет.

2
ответ дан 5 December 2019 в 10:05
поделиться
Другие вопросы по тегам:

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