Почему ManualResetEvent не работает в этом синхронном вызове с использованием Silverlight 4?

Давайте на время отложим в сторону вопрос о том, следует ли пытаться выполнять синхронные операции в контексте приложения 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 асинхронного шаблона проектирования? Или мне чего-то не хватает?

Спасибо

5
задан Community 23 May 2017 в 12:34
поделиться