C # - Попытка создать многопоточный процесс, используя функцию, которая имеет как Action в качестве параметра - PullRequest
2 голосов
/ 13 января 2012

Это проект, который я делаю для собственного удовольствия.

Я начал экспериментировать с комбинацией и перестановками.В консольном приложении у меня есть следующий код

    public static void Save(string newWord)
    {
        using (var db = new MyDataContext())
        {
            var w = new Word {word = newWord};
            db.Words.InsertOnSubmit(w);
            db.SubmitChanges();
        }
    }

    static void Main(string[] args)
    {
        var letters = new[] { 'A', 'B', 'C', '1', '2', '3'};

        for (var i = 2; i < 10; i++)
        {
            letters.GetPermutations(a => Save(string.Join(string.Empty, a.ToArray())), i, true);
        }
    }

В классе расширений у меня есть код для генерации комбинаций.Я нашел код для комбинаций здесь (http://blog.noldorin.com/2010/05/combinatorics-in-csharp/) для тех, кто хочет это просмотреть.

    public static void GetCombinations<T>(this IList<T> list, Action<IList<T>> action, int? resultSize = null, bool withRepetition = false)
    {
        if (list == null)
            throw new ArgumentNullException("list");
        if (action == null)
            throw new ArgumentNullException("action");
        if (resultSize.HasValue && resultSize.Value <= 0)
            throw new ArgumentException(errorMessageValueLessThanZero, "resultSize");

        var result = new T[resultSize.HasValue ? resultSize.Value : list.Count];
        var indices = new int[result.Length];

        for (int i = 0; i < indices.Length; i++)
            indices[i] = withRepetition ? -1 : indices.Length - i - 2;

        int curIndex = 0;

        while (curIndex != -1)
        {
            indices[curIndex]++;

            if (indices[curIndex] == (curIndex == 0 ? list.Count : indices[curIndex - 1] + (withRepetition ? 1 : 0)))
            {
                indices[curIndex] = withRepetition ? -1 : indices.Length - curIndex - 2;
                curIndex--;
            }
            else
            {
                result[curIndex] = list[indices[curIndex]];
                if (curIndex < indices.Length - 1)
                    curIndex++;
                else
                    action(result);
            }
        }
    }

Тогда я подумал, что было бы здорово рассчитать комбинации для всех символов в списке, каждый по-своемуТаким образом, в моем цикле for / next я попытался

Thread t = new Thread(letters.GetPermutations(a => Save(string.Join(string.Empty, a.ToArray())), i, true));

Но, по-видимому, передаваемое действие, вызов функции «Сохранить», не понравилось в теме.мог бы подтолкнуть меня в правильном направлении, я был бы признателен.

Спасибо, Энди

1 Ответ

2 голосов
/ 13 января 2012

Конструктор Thread ищет делегата, но вы, кажется, вместо этого передаете значение. Попробуйте обернуть его в ThreadStart делегат.

ThreadStart del = () => letters.GetPermutations(a => Save(string.Join(string.Empty, a.ToArray())), i, true);
Thread t = new Thread(del);
t.Start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...