Давайте на время отложим в сторону вопрос о том, следует ли пытаться выполнять синхронные операции в контексте приложения Silverlight. Если я использую ManualResetEvent, как в следующем коде:
static string result;
static AutoResetEvent are = new AutoResetEvent(false);
static ManualResetEvent mre = new ManualResetEvent(false);
public static string AsyncCall()
{
string url = "https://stackoverflow.com/feeds/tag/silverlight";
WebClient w = new WebClient();
w.DownloadStringCompleted += new DownloadStringCompletedEventHandler(w_DownloadStringCompleted);
w.DownloadStringAsync(new Uri(url), url);
mre.WaitOne();
return result;
}
static void w_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
result = e.Result;
mre.Set();
}
Как и следовало ожидать из чтения ManualResetEvent в MSDN , «Когда управляющий поток завершает действие, он вызывает метод Set, чтобы сигнализировать, что ожидающие потоки можно продолжить. ", когда Set () вызывается в w_DownloadStringCompleted, управление возвращается ожидающему потоку, который начал ожидание в AsyncCall. Вот что происходит при запуске этого с .NET 4.0. Поток в AsyncCall блокируется до завершения загрузки и вызова Set.
Если я запускаю тот же фрагмент кода в Silverlight 4, вызывается DownloadStringAsync, но управление никогда не достигнет обратного вызова w_DownloadStringCompleted. После вызова WaitOne () этот поток в AsyncCall просто зависает там, а поток, запущенный для обработки DownloadStringAsync, никогда не достигает обратного вызова. Единственный способ, которым я видел, как поток достигает обратного вызова загрузки в SL4, - это если поток из AsyncCall возвращается из AsyncCall. Итак, Set () никогда не вызывается.
Почему ManualResetEvent не работает должным образом в Silverlight 4? Почему он отличается от .NET 4? управление возвращается ожидающему потоку, который начал ожидание в AsyncCall. Вот что происходит при запуске этого с .NET 4.0. Поток в AsyncCall блокируется до завершения загрузки и вызова Set.
Если я запустил тот же фрагмент кода в Silverlight 4, будет вызван DownloadStringAsync, но управление никогда не достигнет обратного вызова w_DownloadStringCompleted. После вызова WaitOne () этот поток в AsyncCall просто зависает там, а поток, запущенный для обработки DownloadStringAsync, никогда не достигает обратного вызова. Единственный способ, которым я видел, как поток достигает обратного вызова загрузки в SL4, - это если поток из AsyncCall возвращается из AsyncCall. Итак, Set () никогда не вызывается.
Почему ManualResetEvent не работает должным образом в Silverlight 4? Почему он отличается от .NET 4? управление возвращается ожидающему потоку, который начал ожидание в AsyncCall. Вот что происходит при запуске этого с .NET 4.0. Поток в AsyncCall блокируется до завершения загрузки и вызова Set.
Если я запустил тот же фрагмент кода в Silverlight 4, будет вызван DownloadStringAsync, но управление никогда не достигнет обратного вызова w_DownloadStringCompleted. После вызова WaitOne () этот поток в AsyncCall просто зависает там, а поток, запущенный для обработки DownloadStringAsync, никогда не достигает обратного вызова. Единственный способ, которым я видел, как поток достигает обратного вызова загрузки в SL4, - это если поток из AsyncCall возвращается из AsyncCall. Итак, Set () никогда не вызывается.
Почему ManualResetEvent не работает должным образом в Silverlight 4? Почему он отличается от .NET 4? Поток в AsyncCall блокируется до завершения загрузки и вызова Set.
Если я запустил тот же фрагмент кода в Silverlight 4, будет вызван DownloadStringAsync, но управление никогда не достигнет обратного вызова w_DownloadStringCompleted. После вызова WaitOne () этот поток в AsyncCall просто зависает там, а поток, запущенный для обработки DownloadStringAsync, никогда не достигает обратного вызова. Единственный способ, которым я видел, как поток достигает обратного вызова загрузки в SL4, - это если поток из AsyncCall возвращается из AsyncCall. Итак, Set () никогда не вызывается.
Почему ManualResetEvent не работает должным образом в Silverlight 4? Почему он отличается от .NET 4? Поток в AsyncCall блокируется до завершения загрузки и вызова Set.
Если я запустил тот же фрагмент кода в Silverlight 4, будет вызван DownloadStringAsync, но управление никогда не достигнет обратного вызова w_DownloadStringCompleted. После вызова WaitOne () этот поток в AsyncCall просто зависает там, а поток, запущенный для обработки DownloadStringAsync, никогда не достигает обратного вызова. Единственный способ, которым я видел, как поток достигает обратного вызова загрузки в SL4, - это если поток из AsyncCall возвращается из AsyncCall. Итак, Set () никогда не вызывается.
Почему ManualResetEvent не работает должным образом в Silverlight 4? Почему он отличается от .NET 4? однако управление никогда не достигнет обратного вызова w_DownloadStringCompleted. После вызова WaitOne () этот поток в AsyncCall просто зависает там, а поток, запущенный для обработки DownloadStringAsync, никогда не достигает обратного вызова. Единственный способ, которым я видел, как поток достигает обратного вызова загрузки в SL4, - это если поток из AsyncCall возвращается из AsyncCall. Итак, Set () никогда не вызывается.
Почему ManualResetEvent не работает должным образом в Silverlight 4? Почему он отличается от .NET 4? однако управление никогда не достигнет обратного вызова w_DownloadStringCompleted. После вызова WaitOne () этот поток в AsyncCall просто зависает там, а поток, запущенный для обработки DownloadStringAsync, никогда не достигает обратного вызова. Единственный способ, которым я видел, как поток достигает обратного вызова загрузки в SL4, - это если поток из AsyncCall возвращается из AsyncCall. Итак, Set () никогда не вызывается.
Почему ManualResetEvent не работает должным образом в Silverlight 4? Почему он отличается от .NET 4? Может быть, это применение Microsoft асинхронного шаблона проектирования? Или мне чего-то не хватает?
Спасибо