Как отлаживать async IO в C #? [Дубликат]

Этот запрос должен работать:

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

Проблема заключается в одинарных кавычках, поэтому ваш запрос завершается с ошибкой и возвращает FALSE, и цикл WHILE не может выполняться. Использование% позволяет сопоставлять любые результаты, содержащие вашу строку (например, SomeText- $ username-SomeText).

Это просто ответ на ваш вопрос, вы должны реализовать материал, упомянутый в других сообщениях: обработка ошибок , используйте escape-строки (пользователи могут вводить что-либо в поле, и вы ДОЛЖНЫ убедиться, что это не произвольный код), используйте PDO вместо mysql_connect, который теперь лишен.

17
задан Liam 12 November 2015 в 12:07
поделиться

1 ответ

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

Интересно, что в статье упоминается решение, но не излагает его , У меня есть сообщение в блоге, которое подробно объясняет CallContext решение . По сути, вы используете контекст логического вызова для создания своего собственного «диагностического контекста».

Мне нравится решение CallContext лучше, чем решение, представленное в статье, потому что оно работает, все формы async код (включая код fork / join, такой как Task.WhenAll).

Это лучшее решение, которое я знаю (кроме того, что вы делаете что-то действительно сложное, например, подключаетесь к API профилирования). Оговорки подхода CallContext:

  • Он работает только на .NET 4.5. Нет поддержки для приложений Windows Store, .NET 4.0 и т. Д.
  • Вам нужно «вручную» ввести свой код вручную. AFAIK не может автоматически вводить его.
  • Исключения не фиксируют контекст логического вызова автоматически. Таким образом, это решение отлично работает, если вы входите в отладчик, когда выбрасываются исключения, но это не так полезно, если вы просто ловите исключения в другом месте и регистрируете их.

Код (зависит от неизменяемых коллекций Библиотека NuGet ):

public static class MyStack
{
    private static readonly string name = Guid.NewGuid().ToString("N");

    private static ImmutableStack<string> CurrentContext
    {
        get
        {
            var ret = CallContext.LogicalGetData(name) as ImmutableStack<string>;
            return ret ?? ImmutableStack.Create<string>();
        }

        set
        {
            CallContext.LogicalSetData(name, value);
        }
    }

    public static IDisposable Push([CallerMemberName] string context = "")
    {
        CurrentContext = CurrentContext.Push(context);
        return new PopWhenDisposed();
    }

    private static void Pop()
    {
        CurrentContext = CurrentContext.Pop();
    }

    private sealed class PopWhenDisposed : IDisposable
    {
        private bool disposed;

        public void Dispose()
        {
            if (disposed)
                return;
            Pop();
            disposed = true;
        }
    }

    // Keep this in your watch window.
    public static string CurrentStack
    {
        get
        {
            return string.Join(" ", CurrentContext.Reverse());
        }
    }
}

Использование:

static async Task SomeWorkAsync()
{
    using (MyStack.Push()) // Pushes "SomeWorkAsync"
    {
        ...
    }
}

Обновление: я выпустил пакет NuGet (описанный в моем блоге) , который использует PostSharp для автоматического ввода тонов и всплывающих окон. Поэтому получить хороший след теперь будет намного проще.

19
ответ дан Stephen Cleary 27 August 2018 в 06:34
поделиться
Другие вопросы по тегам:

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