AutoResetEvent просто блокирует мое приложение Silverlight - PullRequest
0 голосов
/ 28 декабря 2010

У меня есть следующий код в очень простом приложении Silverlight 4.

    void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        var result = string.Empty;
        var mutex = new AutoResetEvent(false);
        var wc = new WebClient();
        wc.DownloadStringCompleted += (s, args) => {
            result = args.Result;
            mutex.Set();
        };
        wc.DownloadStringAsync(new Uri("http://localhost/SilverlightApplication2.Web/SilverlightApplication2TestPage.aspx", UriKind.Absolute));
        mutex.WaitOne();
        MessageBox.Show(result);
    }

По любой причине mutex.Set () никогда не вызывается, поэтому mutex.WaitOne () просто блокируется. Что мне не хватает? Я также пробовал ManualResetEvent.

Спасибо, Randall

Update1:

Если я сделаю следующее, это сработает, как и ожидалось.

    void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        ThreadPool.QueueUserWorkItem(GetIt);
    }

    private void GetIt(object state)
    {
        var result = string.Empty;
        var mutex = new AutoResetEvent(false);

        var wc = new WebClient();
        wc.DownloadStringCompleted += (s, args) => {
            result = args.Result;
            mutex.Set();
        };
        wc.DownloadStringAsync(new Uri("http://localhost/SilverlightApplication2.Web/SilverlightApplication2TestPage.aspx", UriKind.Absolute));

        mutex.WaitOne();
        Dispatcher.BeginInvoke(() => MessageBox.Show(result));
    }

Похоже, существует проблема с потоком пользовательского интерфейса, которая приводит к тому, что обратный вызов не выполняется.

Ответы [ 3 ]

0 голосов
/ 28 декабря 2010

Похоже, что вы ожидаете завершения загрузки, прежде чем начать его.

Я думаю, что вы не можете использовать AutoResetEvent, чтобы сделать это, так как вы не можете избавиться от состояния гонки, когда wc.DownloadStringAsync заканчивается раньше mutex.WaitOne() начинается, и вы будете ждать вечно.ManualResetEvent будет работать, но мьютекс плюс условная переменная будут еще лучше, если они существуют.

0 голосов
/ 29 декабря 2010

Вот ответ: http://www.codeproject.com/KB/silverlight/SynchronousSilverlight.aspx

Вы не можете заблокировать поток пользовательского интерфейса в Silverlight.

0 голосов
/ 28 декабря 2010

Вы делаете это в неправильном порядке:

Сначала вы ждете AutoResetEvent, который блокирует ваш код.Затем вы хотите запустить асинхронную операцию, которая никогда не происходит, потому что вы все еще ожидаете mutex.WaitOne().

Просто переместите строку wc.DownloadStringAsync(new ... над mutex.WaitOne();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...