Многопоточность C # в сети 2, отмена и перезапуск базы данных Firebird, как? - PullRequest
0 голосов
/ 05 февраля 2019

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

Эта загрузка выполняется в другом потоке, я не знаю, как сделать следующий сценарий:

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

В настоящее время она работает таким образом, что DataGridViewзаполняется вторым запросом, но через несколько секунд он заполняется первым запросом.И это не должно, первый запрос должен быть каким-то образом отменен.

Как это сделать?

1 Ответ

0 голосов
/ 06 февраля 2019

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

public static IEnumerable<Row> GetRowsForTheFirstButton()
{
    var token = GridResultsSync.GetCurrentToken();

    // retrieving data
    ...

    if (GridResultsSync.IsTokenRelevant(token))
        return result;
    return null;
}
// exactly the same code for the second method
public static IEnumerable<Row> GetRowsForTheSecondButton()
{
    var token = GridResultsSync.GetCurrentToken();

    // retrieving data
    ...

    if (GridResultsSync.IsTokenRelevant(token))
        return result;

    return null;
}

...
class GridResultsSync
{
    static int _count = 0;
    public static int GetCurrentToken()
    {
        return Interlocked.Increment(ref _count);
    }
    public static bool IsTokenRelevant(int token)
    {
        var currentCount = Interlocked.Increment(ref _count);
        return currentCount - token  <=  2;
    }
}

Когда вы звоните GetRowsForTheFirstButton() и GetRowsForTheSecondButton(), тогда вы проверяете, не является ли результат null, затемвы привязываете результат к сетке, если результат равен нулю, то ничего не делаете.

Если вы действительно хотите отменить запрос к БД, вы можете рассмотреть более сложный подход.Это можно сделать с помощью SqlCommand.Cancel Method или, если вы используете Entity Framework, вы можете использовать CancellationToken .

...