ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Следующий код не то, что я бы когда-либо использовал в реальном приложении. Я наткнулся на эту проблему и хотел бы знать, что происходит под капотами.
Давайте предположим, что по какой-то безумной причине у нас был следующий код ...
using (System.Net.WebClient webClient = new System.Net.WebClient())
{
bool done = false;
webClient.UploadFileCompleted += (s, e) => done = true;
string uploadUri = "ftp://www.notarealurl.com/";
string file = @"temp.txt";
webClient.UploadFileAsync(
new Uri("ftp://www.notarealurl.com/"), "temp.txt");
while (!done)
{
System.Threading.Thread.Sleep(100);
}
}
Этот код работает, как и ожидалось, в простом консольном приложении. Однако переместите его в приложение WPF, и оно никогда не выйдет из цикла while. Это проходило через меня некоторое время, пока мне не пришло в голову, что это может быть связано с тем, что события отбрасываются в насосе сообщений и поэтому не обрабатываются. Чтобы проверить это, я изменил цикл while, как этот ...
while (!done)
{
System.Threading.Thread.Sleep(100);
// Processes all messages currently in the message queue
Dispatcher.Invoke(
DispatcherPriority.Background, new ThreadStart(delegate { }));
}
Конечно, это исправило. Итак, к вопросу ...
Что здесь происходит? Когда я запускаю этот код в консольном приложении, обработчик событий выполняется в рабочем потоке. Почему / как он помещается в основной поток в WPF?