Синхронизация потоков в C #? - PullRequest
0 голосов
/ 01 декабря 2009

У меня много маленьких функций, каждая из которых выполняет запрос. Я хочу, чтобы одновременно выполнялась только одна функция, что является наилучшим способом синхронизации потоков, чтобы избежать проблемы блокировки базы данных в SQLite (C #).

Функции находятся в нескольких классах, как вы будете блокировать все функции во всех классах БД, чтобы выполнялась только одна функция из любого класса БД.

Ответы [ 3 ]

4 голосов
/ 01 декабря 2009

Я буду играть адвоката дьявола ... почему вы хотите вызывать их в отдельных потоках, если только один будет выполняться одновременно? Я просто поместил бы рабочие элементы в очередь и по очереди считывал один поток.

EDIT: Согласно моему комментарию ниже, здесь приведен пример вспомогательного класса, который вы можете использовать для рефакторинга вашего доступа к данным в более централизованное место. Это очень простой пример, не проверенный.

class Database {
    private string connectionString;
    private readonly object syncRoot = new object();

    public Database(string connectionString) {
        this.connectionString = connectionString;
    }

    public void ExecuteReader(SqlCommand command, Action<IDataRecord> forEachRow) {
        lock (syncRoot) {
            using (var connection = new SqlConnection(connectionString)) {
                command.Connection = connection;
                connection.Open();

                using (var reader = command.ExecuteReader()) {
                    while (reader.Read()) {
                        forEachRow(reader);
                    }
                }
            }
        }
    }
}

var myDB = new Database("connection string");
var myCommand = new SqlCommand("select id from blah");
myDB.ExecuteReader(myCommand, row => Console.WriteLine("ID: {0}", row["id"]));
2 голосов
/ 01 декабря 2009

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

public class MyClass
{
    private readonly object lockObject = new object();

    public void MyMethod()
    {
        lock (lockObject)
        {
            // Do stuff
        }
    }

    public void AnotherMethod()
    {
        lock (lockObject)
        {
            // Do stuff
        }
    }
}

У Джона Скита отличная серия для нарезания резьбы: http://www.yoda.arachsys.com/csharp/threads/

2 голосов
/ 01 декабря 2009

Самый простой способ - создать общий объект и заблокировать его с помощью ключевого слова c # lock (). Тем не менее, я считаю, что управлять большими проектами немного неудобно и часто использовал маркеры ожидания .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...