В C #, как и в Swing, если вы находитесь в пользовательском интерфейсе или в потоке событий, то ничего, что вы измените, не будет замечено пользователем, пока вы не закончите.
Итак, если вы хотите переместить их, лучше всего начать с выхода из потока пользовательского интерфейса, создания нового потока, а затем пройти через цикл.
Но проблема в том, что вам нужно быть в потоке пользовательского интерфейса, чтобы внести изменения.
Вот почему ваш сон не работает, вы просто кладете поток событий в сон, кстати.
Какую версию C # вы используете? Существует множество вариантов создания потока и работы с потоком пользовательского интерфейса.
Вот ссылка на создание темы:
http://msdn.microsoft.com/en-us/library/7a2f3ay4(v=vs.80).aspx
Вот способ разобраться с тем, как вернуться в поток пользовательского интерфейса:
http://blogs.msdn.com/b/csharpfaq/archive/2004/03/17/91685.aspx.
Например, чтобы создать поток, вы можете сделать это из http://www.rvenables.com/2009/01/threading-tips-and-tricks/
Я делаю свои темы таким образом, чтобы мне было проще видеть, что происходит.
(new Thread(() => {
DoLongRunningWork();
MessageBox.Show("Long Running Work Finished!");
}) { Name = "Long Running Work Thread",
Priority = ThreadPriority.BelowNormal }).Start();
Наиболее полным ответом о том, как выполнить обновление в потоке пользовательского интерфейса, был бы этот вопрос:
Как обновить графический интерфейс из другого потока в C #?
UPDATE:
Для части, в которой указано выполнение длительной работы, вы можете добавить это перед блоком потока:
TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
Тогда вы можете сделать это в своей теме:
(new Task(() =>
{
//copy pixel
pictureBox2.Invalidate(); // You may want to just invalidate a small block around the pixel being changed, or every some number of changes.
}))
.Start(uiScheduler);
Делая эти изменения, вы можете упростить внесение необходимых изменений, но некоторые из них могут быть более сложными, чем вы хотите, поэтому я дал несколько других ссылок, чтобы дать больше информации. Но, для более подробной информации об использовании Task
, вы можете посмотреть этот отличный блог:
http://reedcopsey.com/2010/03/18/parallelism-in-net-part-15-making-tasks-run-the-taskscheduler/