Вопрос о Поточной обработке C# 2.0 (анонимные методы)

Как уже указывал Саджиб Хан, вы хотите

git reset --hard HEAD~1

, а не git reset --hard HEAD@{1}.

blockquote>

Здесь есть некоторая полезная информация , которая объясняет разницу. * Короче говоря, HEAD в вашем случае никогда не указывал ни на что, кроме (HEAD, origin/feature/RXM-73-create-aws-rollback-script, feature/RXM-73-create-aws-rollback-script), а обозначение @ относится к тому, где головка была *.

Вы можете изучить список возможных @{#} значений, посмотрев на

git reflog

, чтобы убедиться, что HEAD не указывал в другом месте. ,

12
задан Joel Coehoorn 30 October 2008 в 13:57
поделиться

5 ответов

Анонимный метод сохраняет ссылку на переменную в блоке включения - не фактическое значение переменной.

К тому времени, когда методы на самом деле выполняются (при запуске потоков), f был присвоен для указания на последнее значение в наборе, таким образом, все 3 печати потоков то последнее значение.

11
ответ дан 2 December 2019 в 19:56
поделиться

Вот некоторые хорошие статьи об анонимных методах в C# и коде, который будет сгенерирован компилятором:

http://blogs.msdn.com/oldnewthing/archive/2006/08/02/686456.aspx
http://blogs.msdn.com/oldnewthing/archive/2006/08/03/687529.aspx
http://blogs.msdn.com/oldnewthing/archive/2006/08/04/688527.aspx

Я думаю, сделали ли Вы:

   foreach (FileInfo f in files)
   {
       FileInfo f2 = f; //variable declared inside the loop
       Thread t = new Thread(delegate()
       {
            Console.WriteLine(f2.FullName);
       });
       threads.Add(t);
   }

это было бы работать способ, к которому Вы хотели это.

6
ответ дан 2 December 2019 в 19:56
поделиться

Это потому что f.FullName ссылка на переменную и не значение (который является, как Вы пытались использовать его). К тому времени, когда Вы на самом деле запускаете потоки f. FullName был увеличен полностью в конец массива.

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

foreach (FileInfo f in files)
{
   Thread t = new Thread(delegate()
   {
        Console.WriteLine(f.FullName);
   });
   threads.Add(t);
   t.Start();
}

Однако это все еще неправильно, и возможно еще хуже, так как у Вас теперь есть состояние состязания для наблюдения, какой поток идет быстрее: запись консольного объекта или итерация к следующему FileInfo.

0
ответ дан 2 December 2019 в 19:56
поделиться

Это - потому что базовый код для итератора (foreach) уже 'выполнил итерации' через все значения в Списке, прежде чем потоки запустятся... Таким образом, когда они запускают, значение, на которое 'указывает' на итератор, является последним в списке...

Запустите поток в повторении вместо этого....

foreach (FileInfo f in files)
 {   
     string filName = f.FullName;
     Thread t = new Thread(delegate()   
                 { Console.WriteLine(filName); });   
     t.Start();
 }

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

0
ответ дан 2 December 2019 в 19:56
поделиться

Следующее работало бы также.

    Thread t = new Thread(delegate()
    {
        string name = f.Name;
        Console.WriteLine(name);
    });
0
ответ дан 2 December 2019 в 19:56
поделиться
Другие вопросы по тегам:

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