Это может быть особенно плохой пример использования задач или пример того, как использовать задачи плохо.
В своих задачах вы устанавливаете глобальное состояние (SetCursorPosition
), которое, конечно, повлияет на другие задачи (в конце концов, Console
является статическим).Возможно, что
Console.WriteLine('b')
вызывается после того, как курсор был установлен на 0
, 10
или 20
, и наоборот для других значений.Задачи не должны полагаться на какое-либо глобальное состояние (или уровень класса), которое могло бы измениться (кроме случаев, когда для задачи нормально, что значение могло бы измениться).Что касается вашего примера, вы должны убедиться, что ни одна из других задач не вызовет SetCursorPosition
до того, как вы напишете свой вывод.Самый простой способ добиться этого - заблокировать задачу
private static object lockObject = new object(); // you need an object of a reference type for locking
static void Write(char c, int x)
{
int yCounter = 0;
for (int i = 0; i < 1000; i++)
{
lock(lockObject)
{
Console.SetCursorPosition(x, yCounter);
Console.Write(c);
}
yCounter++;
Thread.Sleep(100);
}
}
. lock
гарантирует, что никакие две задачи не входят в блок одновременно (учитывая, что объект блокировки является очень одинаковым ), следовательно, каждая задача может установить курсор в положение, в которое она хочет записать, и записать свой символ без каких-либо других задач, устанавливающих курсор в любую другую позицию.(Кроме того, я поменял местами Write
и SetCursorPosition
, так как перед записью в выходной файл нам нужно будет вызвать SetCursorPosition
- блокировка будет бесполезной, если в любом случае эти две строки не поменяются местами.)